2014-10-02 17 views
14

Non sono sicuro di aver compreso il metodo associate in Laravel. Capisco l'idea, ma non riesco a farlo funzionare.Non riesco a far funzionare Laravel associato

Con questo codice (distillata):

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

ottengo un Call to undefined method Illuminate\Database\Query\Builder::associate() quando provo a fare funzionare questo.

Da quello che posso leggere, lo faccio esattamente come indicato nei documenti.

Cosa sto sbagliando?

risposta

20

Devo ammettere che quando ho iniziato ad usare laravel i rapporti in cui la parte che ho dovuto riferirsi costantemente di nuovo a i documenti per e anche allora in alcuni casi non ho capito bene.

Per semplificare l'utilizzo, associate() viene utilizzato per aggiornare una relazione belongsTo(). Guardando il tuo codice, la classe restituita da $user->customer() è una classe di relazione hasOne e non avrà il metodo associato su di esso.

Se dovessi farlo viceversa.

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

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

Funzionerebbe come $customer->user() è un rapporto belongsTo.

Per fare questo il contrario si dovrebbe prima salvare il modello di utente e quindi salvare il modello di cliente ad esso come:

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

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

Edit: Potrebbe non essere necessario per salvare il modello utente in primo luogo, ma io L'ho sempre fatto, non so perché.

+0

Sì, la prima cosa sembra funzionare correttamente. Penso che sia un po 'strano che debba funzionare in questo modo. Anyhoe, grazie. E così puoi imparare qualcosa di nuovo: $ user-> push(); salva l'utente e tutte le sue relazioni. – Matthijn

+0

Buono a sapersi, grazie Matthijn –

5

Come ho capito, ->associate() può essere chiamato su una relazione BelongsTo. Quindi, nel tuo esempio, tu potresti fare $customer->user()->associate($user). Tuttavia, al fine di 'associato' A ha * rapporto si utilizza ->save(), in modo che il codice dovrebbe essere $user->customer()->save($customer)

+0

aventi lo stesso problema. ma su belongToMany() relazione. come posso risolvere questo? grazie – aleXela

+0

Per i metodi many-to-many (consultare i documenti https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships) si utilizza '-> attach()' e ' -> detach() '. Per esempio. '$ post-> tags() -> attach ($ tag);' Ora, ufficialmente, il metodo attach and detach accetta solo ID, ma quando l'ho provato qualche tempo fa su 4.x, è possibile passare i modelli attuali. Potrebbe essere cambiato per 5.x. – alexrussell

+0

questo tipo di lavoro. ma sta chiedendo un array, e invece sto ricevendo un oggetto. – aleXela

Problemi correlati