2014-10-02 8 views
14

Ich bin nicht ganz sicher, ob ich die associate Methode in Laravel verstehe. Ich verstehe die Idee, aber ich kann es nicht funktionieren lassen.Kann Laravel Associate nicht arbeiten

Mit diesem (destilliert) 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 ein Call to undefined method Illuminate\Database\Query\Builder::associate() wenn ich versuche, dies auszuführen.

Von dem, was ich lesen kann, mache ich es genau wie in den Dokumenten angegeben.

Was mache ich falsch?

Antwort

20

sein Ich muss zugeben, dass, wenn ich anfing Laravel die Beziehungen mit dem der Teil, den ich konsequent zurück verweisen musste die docs für und auch dann habe ich es manchmal nicht richtig verstanden.

Um Ihnen zu helfen, associate() wird verwendet, um eine belongsTo() Beziehung zu aktualisieren. Wenn Sie Ihren Code betrachten, ist die zurückgegebene Klasse $user->customer() eine hasOne Beziehungsklasse und hat keine assoziative Methode.

Wenn Sie es anders herum tun würden.

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

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

Es würde als $customer->user() arbeiten ist eine belongsTo Beziehung.

diese in die andere Richtung zu tun Runde Sie zuerst das Benutzermodell sparen würde und dann, um es den Kunden Modell speichern möchten:

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

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

Edit: Es kann nicht notwendig sein, das Benutzermodell zuerst zu speichern, aber ich Hab das immer gemacht, nicht sicher warum.

+0

Ja, Ihr erstes Ding scheint richtig zu funktionieren. Ich finde es merkwürdig, dass es so funktionieren muss. Anyhoe, danke. Und damit Sie etwas Neues lernen können: $ user-> push(); speichert den Benutzer und alle seine Beziehungen. – Matthijn

+0

Gut zu wissen, danke Matthijn –

5

Wie ich es verstehe, kann ->associate() onyl auf einer BelongsTo Beziehung aufgerufen werden. Also, in Ihrem Beispiel könnten Sie tun $customer->user()->associate($user) tun. Um jedoch zu ‚Associate‘ a * Hat Beziehung Sie ->save() verwenden, so sollten Sie den Code $user->customer()->save($customer)

+0

mit demselben Problem. aber auf der remoteToMany() Relation. Wie könnte ich das beheben? danke – aleXela

+0

Für viele-zu-viele Methoden (siehe Dokument https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships) verwenden Sie '-> attach()' und ' -> detach() '. Z.B. '$ post-> tags() -> attach ($ tag);' Nun akzeptiert offiziell die Attach- und Detach-Methode nur IDs, aber wenn ich dies vor einiger Zeit auf 4.x getestet habe, könntest du die tatsächlichen Modelle passieren. Das könnte sich für 5.x geändert haben. – alexrussell

+0

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