Не могу заставить Ларавела работать

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

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

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() когда я пытаюсь запустить это.

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

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

18

Решение

Я должен признать, что когда я впервые начал использовать 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);

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

28

Другие решения

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

5

По вопросам рекламы [email protected]