laravel tableau croisé dynamique avec nullable de clé étrangère
Question
J'ai un tableau croisé dynamique mettre en place comme suit:
user_roles
user_id //fk->users.id
assoc_id //nullable fk->association.id
role //varchar
J'ai mis ma base de données de cette façon parce que les rôles représentent une relation plusieurs-à-plusieurs:une association a de nombreux utilisateurs, et un utilisateur peut être dans beaucoup d'associations.chaque utilisateur a un rôle à jouer au sein d'une association.
Cependant, il y a certains rôles qui existent qui peuvent exister en dehors d'une association.La base de données est configuré pour accepter une valeur null dans la assoc_id
domaine et je peux insérer manuellement un à partir de la ligne de commande, mais lorsque je tente de l'exécuter
$user->roles()->attach(NULL, "outside contractor");
dans ma graine de fichier, j'obtiens un message d'erreur disant:
[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 ())
cela est particulièrement déroutant parce que ne pas le premier argument ici référence à l' assoc_id
?Lorsque je remplace le NULL
avec un valide assoc_id
,
$user->roles()->attach(1, "outside contractor");
l'insert fonctionne très bien, et le premier argument se réfère à la assoc_id
dans la table.
Ce qui ne va pas?
La solution
Si vous n'avez pas provie un ou les clés pour attach
/sync
, Éloquent ne sera pas insérer quoi que ce soit.C'est plutôt un comportement attendu, puisque ce que vous essayez de faire est:
Créer un lien entre X et la valeur null
ce n'est pas ce que l'ORM est censé faire.
Au lieu d'insérer ces lignes manuellement:
$data = [
'user_id' => 99,
'assoc_id' => null,
'role' => 'outside contractor'
];
DB::table('user_roles')->insert($data);