Domanda

Ho una tabella pivot impostata come segue:

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

Imposta il mio database in questo modo perché i ruoli rappresentano molte a molte relazioni: un'associazione ha molti utenti e un utente può essere in molte associazioni.Ogni utente ha un ruolo all'interno di un'associazione.

Tuttavia, ci sono alcuni ruoli che esistono che possono esistere al di fuori di un'associazione.Il database è configurato per accettare un valore nullo nel campo assoc_id e posso inserire manualmente uno dalla riga di comando, ma quando tento di eseguire

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

Nel mio file seed, ottengo un errore che dice

[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 ()) 
.

Questo è particolarmente confuso perché non dovrebbe essere il primo argomento qui riferendosi al assoc_id?Quando sostituisco il NULL con un assoc_id valido,

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

L'inserto funziona bene, e il primo argomento si riferisce al assoc_id nella tabella.

Cosa sta andando male?

È stato utile?

Soluzione

Se non è possibile fornire un tasto / tasti per attach / sync, eloquente non inserirà nulla.È un comportamento piuttosto atteso, dal momento che ciò che stai cercando di fare è:

Crea un collegamento tra x e null

Questo non è quello che dovrebbe fare ORM.

Invece inserire quelle righe manualmente:

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

DB::table('user_roles')->insert($data);
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top