Laravel Pivot Table con chiave esterna NULLAble
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?
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);
.