Не могу заставить Laravel associate работать

Я не совсем уверен, что понимаю связать метод в Laravel. Я понимаю идею, но не могу заставить ее работать.

С этим (дистиллированная) код:

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

Я Call to undefined method IlluminateDatabaseQueryBuilder::associate() когда я пытаюсь выполнить это.

из того, что я могу прочитать, я делаю это точно так, как указано в документах.

что я делаю не так?

2 ответов


Я должен признать, что когда я впервые начал использовать Laravel отношения, где часть, которую я должен был последовательно ссылаться на документы, и даже тогда в некоторых случаях я не совсем понял это правильно.

, чтобы помочь вам в этом, associate() используется для обновления belongsTo() отношения. Глядя на ваш код, возвращаемый класс $user->customer() это hasOne класс отношений и не будет иметь метода associate на нем.

если бы вы сделали это по-другому круглый.

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

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

он будет работать как $customer->user() это belongsTo отношения.

чтобы сделать это наоборот, вы сначала сохраните модель пользователя, а затем сохраните модель клиента, как:

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

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

Edit: возможно, сначала не нужно сохранять модель пользователя, но я всегда это делал, не знаю почему.


как я понимаю, ->associate() может onyl вызываться в отношении принадлежности. Итак, в вашем примере вы мог бы do $customer->user()->associate($user). Однако, для того, чтобы "связать" имеет* отношения вы используете ->save(), Так что ваш код должен быть $user->customer()->save($customer)