Je ne suis pas sûr de comprendre la méthode associé de Laravel. Je comprends l'idée, mais je n'arrive pas à la faire fonctionner.
Avec ce code (distillé):
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);
J'obtiens une Call to undefined method Illuminate\Database\Query\Builder::associate()
lorsque j'essaye de l'exécuter.
D'après ce que je peux lire, je le fais exactement comme indiqué dans la documentation.
Qu'est-ce que je fais mal?
Je dois admettre que lorsque j'ai commencé à utiliser Laravel les relations où la partie que je devais constamment renvoyer aux documents et même dans certains cas, je ne l'ai pas tout à fait bien compris) .
Pour vous aider, associate()
est utilisé pour mettre à jour une relation belongsTo()
. En regardant votre code, la classe retournée de $user->customer()
est une classe de relations hasOne
et n'aura pas la méthode associée.
Si vous deviez le faire dans l'autre sens.
$user = new User($data);
$customer = new Customer($customerData);
$customer->user()->associate($user);
$customer->save();
Cela fonctionnerait comme $customer->user()
est une relation belongsTo
.
Pour ce faire dans l'autre sens, vous devez d'abord enregistrer le modèle utilisateur, puis enregistrer le modèle client comme suit:
$user = new User($data);
$user->save();
$customer = new Customer($customerData);
$user->customer()->save($customer);
Edit: il n'est peut-être pas nécessaire d'enregistrer le modèle utilisateur en premier, mais je l'ai toujours fait, je ne sais pas pourquoi.
Si je comprends bien, ->associate()
peut uniquement être appelé sur une relation BelongsTo. Ainsi, dans votre exemple, vous pourriez faire $customer->user()->associate($user)
. Cependant, pour "associer" une relation Has *, vous utilisez ->save()
, donc votre code doit être $user->customer()->save($customer)