Мне любопытно, почему отношения 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
, но я использую нестандартное имя таблицы для хранения этих отношений, почему я могу использовать эту нестандартную таблицу, идущую в одну сторону, а не другую?
hasMany
используется в отношениях от одного до многих, в то время как принадлежит belongsToMany
относится к отношениям Many to Many . Они оба представляют собой различные типы отношений, и для каждого из них требуется другая структура базы данных, поэтому они принимают разные параметры.
Основное различие заключается в том, что в отношениях от одного до многих вам нужны только две таблицы базы данных, соответствующие соответствующим моделям. Это связано с тем, что ссылка на отношение хранится в собственной таблице модели . Например, у вас может быть модель Country
модель City
. В стране много городов. Однако каждый Город существует только в одной стране. Поэтому вы бы сохранили эту страну в самой модели города (как country_id
или что-то в этом роде).
Однако для отношения «многие ко многим» требуется третья таблица базы данных, называемая сводной таблицей . В сводной таблице хранятся ссылки на обе модели, и вы можете объявить ее как второй параметр в объявлении отношений. Например, представьте, что у вас есть модель City
и у вас также есть модель Car
. Вы хотите, чтобы отношения показывали типы автомобилей, которые люди ездили в каждом городе. Ну, в одном городе люди будут ездить на многих разных типах автомобилей. Однако, если вы посмотрите на один тип автомобиля, вы также узнаете, что его можно проехать в разных городах. Поэтому было бы невозможно сохранить city_id
или car_id
на любой модели, потому что у каждого было бы больше одного. Поэтому вы помещаете эти ссылки в сводную таблицу.
Как правило, если вы используете отношение belongsToMany
, оно может быть сопряжено только с другим отношением belongsToMany
и означает, что у вас есть третья сводная таблица. Если вы используете отношения hasMany
, его можно hasMany
только с отношением belongsTo
и дополнительные таблицы базы данных не требуются.
В вашем примере вам просто нужно сделать обратное отношение в belongsToMany
и добавить свою собственную таблицу снова, а также внешние и локальные ключи (изменение порядка с другой модели).
Попытайтесь понять текст и цифру.
Отношения один к одному (hasOne):
Один для многих (hasMany):
Многим многим (BelongsToMany):