Уточните, как настроить отношения "один ко многим" в Laravel Rloquent ORM
Хорошо, я работаю над документами Laravel 4, чтобы настроить отношения "один ко многим" между двумя моделями. Очевидно, что одна сторона должна использовать hasMany(). Но для другой стороны, следует ли использовать hasOne или принадлежать? Это имеет значение? Какая разница? Почему обе существуют?
Я думал, что hasOne будет для взаимно-однозначных отношений, и принадлежит для одной стороны одного-ко-многим. Но в документах для вставки связанной модели здесь:
http://laravel.com/docs/eloquent#inserting-related-models
они используют save()
, который, кажется, присутствует только в отношениях hasOne
и hasMany
, а не в belongsTo
. Похоже, что belongsTo
использует associate()
для этой же цели:
https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php#L188
Возможно, мне просто нужен общий фон, когда следует использовать belongsTo
vs. hasOne
, и почему belongsTo
использует associate()
, а hasOne
использует save()
.
EDIT: Я предполагаю, что моя точка зрения заключалась в том, что в документах (http://laravel.com/docs/eloquent#inserting-related-models) они использовали:
$post->comments()->save($comment);
где я бы использовал:
$comment->post()->associate($post);
Есть ли преимущество для одного или другого? Или это просто вопрос о том, что имеет смысл в контексте?
Ответы
Ответ 1
Пожалуйста, обратитесь к документам laravel по одному для многих отношений между сообщениями и комментариями http://laravel.com/docs/eloquent#relationships. (Там, где у одного сообщения много комментариев, а комментарий принадлежит сообщению).
Таблицы для сообщений и комментариев выглядят следующим образом
Таблица сообщений
id | название | Тело
Таблица комментариев
id | Комментарий | post_id
Таблица базы данных, содержащая внешний ключ, принадлежит к записи в другой таблице, поэтому в модели комментариев вы должны указать, что комментарии принадлежат сообщениям.
Вы правы, что отношение hasOne применимо только к отношениям один к одному.
Вот сообщение в блоге с кодом laravel 3, в котором объясняется, как работают красноречие методы отношений.
http://laravel.io/topic/14/how-eloquent-relationship-methods-work