Невозможно связаться с 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 Illuminate\Database\Query\Builder::associate(), когда пытаюсь запустить это.

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

Что я делаю неправильно?

Ответы

Ответ 1

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

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

Если бы вы сделали это наоборот.

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

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

Ответ 2

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