Я не совсем уверен, понимаю ли я ассоциировать метод в Ларавеле. Я понимаю идею, но не могу заставить ее работать.
С этим (дистиллированным) кодом:
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
класс отношений и не будет иметь ассоциированного метода.
Если бы вы делали это наоборот.
$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()
Может ли быть вызван только на отношения BelongsTo. Итак, в вашем примере вы мог делать $customer->user()->associate($user)
, Однако, чтобы «связать» отношение Has *, которое вы используете ->save()
поэтому ваш код должен быть $user->customer()->save($customer)