Мне любопытно, почему отношения 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):