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