Laravel Model Beziehungen mit foreign key-Einschränkungen
Ich versuche, foreign key-Einschränkungen eine Arbeit in Laravel. Aber ich kann nicht scheinen, um meine Modelle nicht mehr.
Meine Datenbank-Struktur setup ist wie folgt (ich habe entfernt unnötigen code):
Schema::create($this->tableName, function(Blueprint $table)
{
$table->increments('id');
$table->string('username')->unique();
$table->string('password', 64);
$table->integer('address_id')->unsigned();
});
Schema::create($this->tableName, function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('name');
$table->string('surname');
$table->string('street');
$table->string('number');
$table->string('town');
$table->string('country');
});
Also die Address
ist in einer separaten Tabelle und eine Address
gehört zu einer User
. Die User
hat eine Address
.
Nächstes habe ich die entsprechenden Modelle:
Class User extends Model
{
public function address()
{
return $this->hasOne('Address');
}
}
Class Address extends Model
{
public function user()
{
return $this->belongsTo('User');
}
}
Wenn ich jetzt versuche zum erstellen einer User
mit einem Address
und speichern Sie es ich bekomme constraint-Fehler. Ich habe versucht, es in beide Richtungen (speichern der User
zuerst und speichern die Address
erste), aber beide geben einen Fehler aus.
Die erste Idee die ich hatte war dieses:
//Create a new user
$user = new User($data);
$address = new Address($addressData);
$address->user()->associate($user);
$user->push(); //Error here
Aber das gibt den Fehler:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`eet`.`users`, CONSTRAINT `users_address_id_foreign` FOREIGN KEY (`address_id`) REFERENCES `addresses` (`id`)) (SQL: insert into `users` (`username`, `email`, `password`, `type`, `phone`, `cellphone`, `newsletter_week`, `ip`, `updated_at`, `created_at`) values (adsadsad, validemail@gmail.comx, passWO23dw00, customer, 123123213, 1234567890, 1, ::1, 2014-10-05 19:56:03, 2014-10-05 19:56:03))
So, ich habe versucht, das speichern der Address
zuerst, und dann die User
wie:
$user = new User($data);
$address = new Address($addressData);
$address->save(); //Error here
$address->user()->associate($user);
$user->push();
Aber dann der folgende Fehler wird generiert:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null (SQL: insert into `addresses` (`name`, `surname`, `street`, `number`, `town`, `country`, `user_id`) values (Foo, Bar, FooStreet, 200, Townsville, nl, ))
Also, was ist ein guter Weg, dies zu tun? Ich konnte das Feld address_id
für die User
null-Werte zulässt, aber ist das eine gute übung? Ich will eine User
immer ein Address
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde beginnen mit Datenbank-design-ersten.
Für
users
Tabelle, die ich benutzen würde:address_id ist hier nicht notwendig.
Für
addresses
Tabelle, die ich benutzen würde:Sollten Sie verwenden Fremdschlüssel in der Tabelle "Adressen" und fügen Sie onDelete ("KASKADEN") - nun, wenn Sie Benutzer entfernen, Adresse werden automatisch entfernt. Sie haben noch keine verwaiste Adressen.
Nun einfügen von Daten:
Brauchen Sie nicht zu setzen, in
$addressData
alleuser_id
- es wird automatisch ausgefüllt.address_id
unddelivery_address_id
in der Benutzer-Tabelle. Wenn ich entfernen address_id von meinem user werde ich nicht in der Lage sein, zu differenzieren.address_id
in der User-Tabelle hat nichts mitAddress
Modell?Retten Sie zuerst die übergeordnete
model
- und in diesem Fall ist esUser
so:Dann versuchen:
Oder vielleicht:
User
ist die "Definition der Einheit", hier. Und einUser
hat eineAddress
. Was ich glaube, was Sie sagen, ist: "Entfernen Sie dieuser_id
ausAddress
und du bist gut zu gehen." Dann könnte ich doch machen "verwaiste" Adressen.address
Tisch hatuser_id
?