Eins-zu-eins-Beziehung in Laravel speichern

Lesezeit: 3 Minuten

EIN User hat eins (oder null) Companyund ein Company gehört einem und nur einem User. Ich versuche, ein Unternehmen für einen Benutzer zu speichern, aber jedes Mal, wenn ich die Speichermethode erneut auslöse, wird ein neuer Eintrag in die Datenbank eingefügt. Es ist eine Eins-zu-Eins-Beziehung, also dachte ich save Methode an User.

So Company hat eine Methode user():

public function user() {
    return $this->belongsTo(User::class, 'user_id');
}

Und User hat eine Methode company():

public function company() {
    return $this->hasOne(Company::class, 'user_id');
}

Ich versuche, das Unternehmen eines Benutzers wie folgt zu speichern (also zu erstellen oder zu aktualisieren) (in einem Controller):

$company = new Company();
$company->name="Test";
User::findOrFail(1)->company()->save($company);

Wenn ich diesen Code zum ersten Mal ausführe, erstellt er den Eintrag in der Datenbank (OK), aber beim zweiten Mal fügt er einen neuen Eintrag für denselben Benutzer hinzu (nicht OK). Ich dachte, es wird nur den Datenbankeintrag aktualisieren.

Ist es ein Fehler (oder etwas, das ich in einer Eins-zu-eins-Beziehung nicht verstehe) in Laravel oder mache ich etwas falsch? (Ich denke und hoffe es ist der zweite Zweck)

  • Überprüfen Sie diese Antwort, sie könnte Ihnen helfen: stackoverflow.com/a/20764237/5122070

    – Mihkel Allorg

    10. September 2015 um 9:39 Uhr

  • Danke, aber ich bin mir nicht sicher, ob es bei diesem speziellen Problem wirklich hilft. Mein Problem ist spezifischer. Es geht um das Speichern (Erstellen oder Aktualisieren) direkt im Zusammenhang

    – rap-2-h

    10. September 2015 um 9:46 Uhr

  • @rap-2-h Mihkel Allorgs Referenz war korrekt. Man kann die verwenden updateOrCreate Methode auch auf Beziehungen. Dies ist der beste Weg, dies zu tun. Siehe meine Antwort stackoverflow.com/a/56002200/2311074

    – Adam

    22. Juni 2019 um 8:21 Uhr


Erstellen und Aktualisieren müssen unterschiedlich behandelt werden. Überprüfen Sie also zuerst das Vorhandensein des Firmenattributs.

$user = User::with('company')->findOrFail(1);
if ($user->company === null)
{
    $company = new Company(['name' => 'Test']);
    $user->company()->save($company);
}
else
{
    $user->company->update(['name' => 'Test']);
}

Beachten Sie, dass hasOne() garantiert nicht, dass Sie eine Eins-zu-Eins-Beziehung haben, sondern sagt Eloquent nur, wie eine Abfrage erstellt wird. Es funktioniert, auch wenn Sie mehrere haben Company beziehen sich auf dasselbe Userin diesem Fall, wenn Sie anrufen $user->company du wirst zuerst kommen Company im Ergebnisdatensatz aus Datenbank.

  • OK danke. “Beachten Sie, dass hasOne() nicht garantiert, dass Sie eine Eins-zu-Eins-Beziehung haben, sondern Eloquent nur mitteilt, wie eine Abfrage erstellt wird” -> Sehr hilfreich, es ist jetzt klar genug.

    – rap-2-h

    10. September 2015 um 10:10 Uhr

$user = User::findOrFail(1);
$company = $user->company ?: new Company;
$company->name="Test";
$user->company()->save($company);

  • So auch! Schnell und sauber! +1 🙂

    – rap-2-h

    10. September 2015 um 10:19 Uhr

Adams Benutzeravatar
Adam

Ich versuche, das Unternehmen eines Benutzers zu speichern (also zu erstellen oder zu aktualisieren).

Mit dem kannst du genau das machen updateOrCreate Methode:

User::findOrFail(1)->company()->updateOrCreate([],['name' => 'xyz']);

Der erste Parameter von updateOrCreate ist ein leeres Array, weil die Unternehmen id wird bestimmt durch die hasOne Beziehung $user->company().

Übrigens würde ich empfehlen, kein Auto-Increment-ID-Feld in a zu verwenden hasOne Beziehung. Wenn Sie einstellen user_id als primär in Ihrer Unternehmenstabelle, ist es technisch nicht möglich, doppelte Unternehmenszeilen für einen Benutzer zu erstellen. Sieh dir mein an Blogeintrag für mehr.

1404890cookie-checkEins-zu-eins-Beziehung in Laravel speichern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy