laravel-Pivot-Tabelle mit nullfähigem Fremdschlüssel
Frage
Ich habe eine Pivot-Tabelle wie folgt eingerichtet:
user_roles
user_id //fk->users.id
assoc_id //nullable fk->association.id
role //varchar
Ich habe meine Datenbank auf diese Weise eingerichtet, weil Rollen eine Viele-zu-Viele-Beziehung darstellen:eine Assoziation hat viele Benutzer, und ein Benutzer kann in vielen Assoziationen sein.jeder Benutzer hat eine Rolle innerhalb einer Assoziation.
Es gibt jedoch einige Rollen, die außerhalb einer Assoziation existieren können.Die Datenbank ist so konfiguriert, dass sie einen Nullwert in der Datenbank akzeptiert assoc_id
feld und ich kann manuell eines über die Befehlszeile einfügen, aber wenn ich versuche auszuführen
$user->roles()->attach(NULL, "outside contractor");
in meiner Seed-Datei wird eine Fehlermeldung angezeigt
[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 ())
dies ist besonders verwirrend, denn sollte sich das erste Argument hier nicht auf das beziehen assoc_id
?Wenn ich das ersetze NULL
mit einem gültigen assoc_id
,
$user->roles()->attach(1, "outside contractor");
die Einfügung funktioniert einwandfrei und das erste Argument bezieht sich auf das assoc_id
in der Tabelle.
Was läuft schief?
Lösung
Wenn Sie keinen Schlüssel / Schlüssel für attach
/sync
, Eloquent wird nichts einfügen.Es ist eher erwartetes Verhalten, da Sie versuchen, Folgendes zu tun:
Erstellen Sie eine Verknüpfung zwischen X und null
das ist nicht das, was ORM tun soll.
Fügen Sie diese Zeilen stattdessen manuell ein:
$data = [
'user_id' => 99,
'assoc_id' => null,
'role' => 'outside contractor'
];
DB::table('user_roles')->insert($data);