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?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top