Non riesco a far associare Laravel a lavoro

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

Con questo codice (distillato):

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

Ricevo una Call to undefined method Illuminate\Database\Query\Builder::associate() quando provo a eseguirlo.

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

Che cosa sto facendo di sbagliato?

Devo ammettere che quando ho iniziato a utilizzare Laravel le relazioni in cui la parte che avevo costantemente rimandava ai documenti, e anche in alcuni casi, non ho capito bene.

Per aiutarti, associate() viene utilizzato per aggiornare una relazione belongsTo() . Osservando il codice, la class restituita da $user->customer() è una class di relazione hasOne e non avrà il metodo associato su di essa.

Se wheressi farlo viceversa.

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

belongsTo come $customer->user() è una relazione belongsTo .

Per fare questo, in un altro modo, devi prima salvare il model utente e poi salvare il model del cliente come:

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

Modifica: Potrebbe non essere necessario salvare prima il model utente, ma l'ho sempre fatto, non so perché.

A quanto ho capito, ->associate() può essere chiamato su una relazione BelongsTo. Quindi, nel tuo esempio, potresti fare $customer->user()->associate($user) . Tuttavia, per "associare" una relazione Has * si usa ->save() , quindi il codice dovrebbe essere $user->customer()->save($customer)