Не могу заставить 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)