Я не совсем уверен, понимаю ли я метод ассоциирования в 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()
когда я пытаюсь запустить это.
Из того, что я могу читать, я делаю это точно так, как указано в документах.
Что я делаю не так?
Я должен признать, что, когда я впервые начал использовать Laravel, отношения, в которых часть, которую я должен был последовательно ссылаться на документы, и даже тогда, в некоторых случаях, я не совсем понял это правильно.
Чтобы помочь вам, associate()
используется для обновления отношения belongsTo()
. Глядя на ваш код, возвращаемый класс из $user->customer()
является hasOne
отношений hasOne
и на нем не будет ассоциированного метода.
Если бы вы сделали это наоборот.
$user = new User($data); $customer = new Customer($customerData); $customer->user()->associate($user); $customer->save();
на$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);
Изменить. Возможно, сначала не нужно сначала сохранять модель пользователя, но я всегда делал это, не зная почему.
Как я понимаю, ->associate()
можно вызывать onyl в отношении BelongsTo. Итак, в вашем примере вы можете сделать $customer->user()->associate($user)
. Однако, чтобы «связать» отношение Has *, которое вы используете, ->save()
, поэтому ваш код должен быть $user->customer()->save($customer)