Подтвердить что ты не робот

HasMany vs принадлежит ToMany в laravel 5.x

Мне любопытно, почему отношение Eloquent для hasMany имеет другую подпись, чем для belongsToMany. В частности, имя таблицы настраиваемых соединений - для системы, в которой данный Comment принадлежит ко многим Role s, а для данного Role будет много Comment s, я хочу сохранить отношение в таблице с именем my_custom_join_table и установите ключи как comment_key и role_key.

return $this->belongsToMany('App\Role', 'my_custom_join_table', 'comment_key', 'role_key'); // works

Но в обратном я не могу определить эту пользовательскую таблицу (по крайней мере, документы ее не упоминают):

return $this->hasMany('App\Comment', 'comment_key', 'role_key');

Если у меня есть объект Role, который hasMany Comments, но я использую имя нестандартной таблицы для хранения этого отношения, почему я могу использовать эту нестандартную таблицу, идущую в одну сторону, но не другую?

4b9b3361

Ответ 1

hasMany используется в отношениях "Один ко многим" , а belongsToMany относится к Многим многим. Они оба представляют собой различные типы отношений, и для каждого из них требуется другая структура базы данных, поэтому они принимают разные параметры.

Ключевое различие заключается в том, что в отношениях от одного до многих вам нужны только две таблицы базы данных, соответствующие соответствующим моделям. Это связано с тем, что ссылка на отношение хранится в собственной таблице моделей. Например, у вас может быть модель Country и модель City. В стране много городов. Однако каждый Город существует только в одной стране. Поэтому вы бы сохранили эту страну в самой модели города (как country_id или что-то в этом роде).

Однако для отношения "Множество ко многим" требуется третья таблица базы данных, называемая сводной таблицей. В сводной таблице хранятся ссылки на обе модели, и вы можете объявить ее как второй параметр в объявлении отношений. Например, представьте, что у вас есть модель City, и у вас также есть модель Car. Вы хотите, чтобы отношения показывали типы автомобилей, которые люди ездили в каждом городе. Ну, в одном городе люди будут ездить на многих разных типах автомобилей. Однако, если вы посмотрите на один тип автомобиля, вы также узнаете, что его можно проехать в разных городах. Поэтому было бы невозможно сохранить city_id или car_id на каждой из двух моделей, потому что у каждого из них будет более одного. Поэтому вы помещаете эти ссылки в сводную таблицу.

Как правило, если вы используете отношение belongsToMany, его можно связать только с другим отношением belongsToMany и означает, что у вас есть третья сводная таблица. Если вы используете связь hasMany, ее можно связать только с отношением belongsTo и не требуется дополнительных таблиц базы данных.

В вашем примере вам просто нужно сделать обратное отношение в belongsToMany и добавить свою собственную таблицу снова, а также внешние и локальные ключи (изменение порядка от другой модели).

Ответ 2

Попытайтесь понять текст и цифру.

  • Отношения один к одному (hasOne):

    • Пользователь имеет (может иметь) один профиль. Таким образом, профиль принадлежит одному пользователю.
  • Один для многих (hasMany):

    • У пользователя много (может быть много) статей. Таким образом, многие статьи принадлежат одному пользователю.
  • Многие для многих (BelongsToMany):

    • Пользователь может принадлежать многим форумам. Итак, форум принадлежит многим пользователям.

    RelationShip