web-dev-qa-db-fra.com

Impossible d'obtenir Laravel associé pour travailler

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?

22
Matthijn

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.

36
David Barker

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)

5
alexrussell