2014-10-02 29 views
14

Nie jestem całkiem pewien, czy rozumiem metodę associate w Laravel. Rozumiem ten pomysł, ale nie mogę tego zmusić do działania.Nie można uzyskać współpracownika Laravel do pracy

Z tego (destylowanej) Kod:

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); 

dostaję Call to undefined method Illuminate\Database\Query\Builder::associate() gdy próbuję uruchomić to.

Z tego, co mogę przeczytać, robię to dokładnie tak, jak jest to określone w dokumentach.

Co robię źle?

Odpowiedz

20

Muszę przyznać, że kiedy po raz pierwszy zaczął używać laravel relacje gdzie część, że muszę konsekwentnie odwołują się do Dokumenty na i nawet wtedy w niektórych przypadkach nie całkiem to dobrze.

Aby pomóc Ci w czasie, associate() służy do aktualizacji relacji belongsTo(). Patrząc na Twój kod, zwrócona klasa z $user->customer() jest klasą relacji hasOne i nie ma na niej metody skojarzonej.

Jeśli robisz to w drugą stronę.

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

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

będzie ona działać jako $customer->user() jest relacją belongsTo.

Aby to zrobić na odwrót należy najpierw zapisać model użytkownika, a następnie zapisać model klientom się podoba:

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

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

Edit: To może nie być konieczne, aby zapisać model obsługi pierwszy, ale ja Zawsze to robiłem, nie wiem dlaczego.

+0

Tak, twoja pierwsza rzecz wydaje się działać poprawnie. Myślę, że to trochę dziwne, że musi działać w ten sposób. Anyhoe, dzięki. Abyś mógł nauczyć się czegoś nowego: $ user-> push(); zapisuje użytkownika i wszystkie jego relacje. – Matthijn

+0

Dobrze wiedzieć, dziękuję Matthijn –

5

Jak rozumiem, ->associate() może onyl zostać wywołany w związku BelongsTo. Tak więc w twoim przykładzie możesz może do $customer->user()->associate($user). Jednakże, w celu „współpracownik” A ma * stosunki użyć ->save(), więc kod powinien być $user->customer()->save($customer)

+0

ma ten sam problem. ale w stosunku belongsToMany(). jak mogę to naprawić? dziękuje – aleXela

+0

Dla metod wielu do wielu (zobacz dokumenty https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships) używasz '-> attach()' i ' -> odłącz() '. Na przykład. '$ post-> tags() -> attach ($ tag);" Teraz, oficjalnie, metoda attach and unpach akceptuje tylko identyfikatory, ale kiedy testowałem to jakiś czas temu na 4.x, mogłeś przekazać aktualne modele. To mogło się zmienić na 5.x. – alexrussell

+0

ten rodzaj pracy. ale prosi o tablicę, a zamiast tego otrzymuję obiekt. – aleXela

Powiązane problemy