Kann Laravel-Mitarbeiter nicht zum Laufen bringen

Lesezeit: 3 Minuten

Benutzer-Avatar
Matthias

Ich bin mir nicht ganz sicher, ob ich das verstehe assoziieren Methode in Laravel. Ich verstehe die Idee, aber ich kann es nicht zum Laufen bringen.

Mit diesem (destillierten) Code:

class User
{

    public function customer()
    {
        return $this->hasOne('Customer');
    }

}

class Customer
{

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

}

$user = new User($data);
$customer = new Customer($customerData);

$user->customer()->associate($customer);

Ich bekomme ein Call to undefined method Illuminate\Database\Query\Builder::associate() wenn ich versuche, dies auszuführen.

Soweit ich lesen kann, mache ich es genau so, wie es in der Dokumentation steht.

Was mache ich falsch?

Ich muss zugeben, dass, als ich anfing, Laravel zu verwenden, die Beziehungen der Teil waren, für den ich ständig auf die Dokumentation zurückgreifen musste, und selbst dann habe ich es in einigen Fällen nicht ganz richtig verstanden.

Um Ihnen weiter zu helfen, associate() wird verwendet, um a zu aktualisieren belongsTo() Beziehung. Wenn Sie sich Ihren Code ansehen, wird die zurückgegebene Klasse von $user->customer() ist ein hasOne Beziehungsklasse und enthält nicht die Associate-Methode.

Wenn du es umgekehrt machen würdest.

$user = new User($data);
$customer = new Customer($customerData);

$customer->user()->associate($user);
$customer->save();

Es würde so funktionieren $customer->user() ist ein belongsTo Beziehung.

Um dies umgekehrt zu tun, würden Sie zuerst das Benutzermodell und dann das Kundenmodell wie folgt speichern:

$user = new User($data);
$user->save();

$customer = new Customer($customerData);
$user->customer()->save($customer);

Bearbeiten: Es ist möglicherweise nicht erforderlich, das Benutzermodell zuerst zu speichern, aber ich habe das immer getan, nicht sicher warum.

  • Ja, deine erste Sache scheint richtig zu funktionieren. Ich finde es irgendwie seltsam, dass es so funktionieren muss. Wie auch immer, danke. Und damit Sie etwas Neues lernen: $user->push(); speichert den Benutzer und alle seine Beziehungen.

    – Matthias

    2. Oktober 2014 um 12:55 Uhr

  • Ich habe bemerkt, dass wir tun müssen $customer->save() nach ->associate($something)

    – wosaldi

    29. Mai 2019 um 1:33 Uhr

  • mit anderen Worten, die Benutzerklasse hostet/hat den Kunden. Damit wir den Benutzer einem bestimmten Kunden zuordnen/entfernen können $customer->user()->associate($user) oder $customer->user()->associate()neben $customer->save()

    – CodeToLife

    10. Februar 2021 um 0:53 Uhr


  • So können Sie nach der Zuordnung auch direkt speichern $customer->user()->associate($user)->save();

    – Gkiokan

    17. Oktober 2021 um 21:42 Uhr


So wie ich es verstehe, ->associate() kann nur in einer BelongsTo-Beziehung aufgerufen werden. In Ihrem Beispiel also Sie könnte tun $customer->user()->associate($user). Um jedoch eine Has*-Beziehung zu „verknüpfen“, verwenden Sie ->save()so sollte Ihr Code sein $user->customer()->save($customer)

  • gleiches Problem haben. aber auf derBeziehung gehörenToMany(). wie könnte ich das beheben? Danke

    – aleXela

    29. November 2016 um 21:30 Uhr

  • Für Many-to-Many-Methoden (siehe docs laravel.com/docs/5.3/…) Sie nutzen ->attach() und ->detach(). Z.B $post->tags()->attach($tag); Jetzt akzeptiert die Attach- und Detach-Methode offiziell nur IDs, aber als ich das vor einiger Zeit auf 4.x getestet habe, konnten Sie tatsächliche Modelle übergeben. Das könnte sich für 5.x geändert haben.

    – Alex Russell

    1. Dezember 2016 um 9:57 Uhr

  • das funktioniert irgendwie. aber es fragt nach einem Array, und ich bekomme stattdessen ein Objekt.

    – aleXela

    1. Dezember 2016 um 21:18 Uhr

  • Ich denke, Ihre beste Vorgehensweise hier ist, eine neue Frage speziell zu Ihrem Problem zu stellen. Fügen Sie die Version von Laravel, die Sie verwenden, und jeden relevanten Code hinzu, und ich bin sicher, dass Sie die Hilfe erhalten, die Sie benötigen.

    – Alex Russell

    5. Dezember 2016 um 14:25 Uhr

1065550cookie-checkKann Laravel-Mitarbeiter nicht zum Laufen bringen

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

Privacy policy