Сводная таблица laravel с обнуляемым внешним ключом
Вопрос
У меня есть сводная таблица, настроенная следующим образом:
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);