Сводная таблица laravel с обнуляемым внешним ключом

StackOverflow https://stackoverflow.com//questions/25008595

  •  20-12-2019
  •  | 
  •  

Вопрос

У меня есть сводная таблица, настроенная следующим образом:

user_roles
  user_id //fk->users.id
  assoc_id //nullable fk->association.id
  role //varchar

Я настроил свою базу данных таким образом, потому что роли представляют отношения многие-ко-многим:ассоциация имеет много пользователей, и пользователь может состоять во многих ассоциациях.каждый пользователь имеет свою роль в ассоциации.

Однако существуют некоторые роли, которые могут существовать вне ассоциации.База данных настроена на прием нулевого значения в assoc_id поле, и я могу вручную вставить его из командной строки, но когда я пытаюсь выполнить

$user->roles()->attach(NULL, "outside contractor");

в моем исходном файле я получаю сообщение об ошибке

[Illuminate\Database\QueryException]                                         
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update   
a child row: a foreign key constraint fails (`database`.`user_roles`, CONSTR  
AINT `user_roles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users  
` (`id`)) (SQL: insert into `user_roles` () values ()) 

это особенно сбивает с толку, потому что не должен ли первый аргумент здесь относиться к assoc_id?Когда я заменяю NULL с действительным assoc_id,

$user->roles()->attach(1, "outside contractor");

вставка работает нормально, и первый аргумент относится к assoc_id в таблице.

Что происходит не так?

Это было полезно?

Решение

Если вы не предоставите ключ/ключи для attach/sync, Eloquent ничего не вставит.Это довольно ожидаемое поведение, поскольку вы пытаетесь сделать следующее:

Создайте связь между X и null

это не то, что должен делать ORM.

Вместо этого вставьте эти строки вручную:

$data = [
   'user_id' => 99, 
   'assoc_id' => null, 
   'role' => 'outside contractor'
];

DB::table('user_roles')->insert($data);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top