Почему внешний ключ в отношении hasOne должен находиться в ссылочной таблице? - PullRequest
0 голосов
/ 11 октября 2019

Почему Eloquent от Laravel настаивает на том, что внешний ключ в отношении hasOne должен быть в ссылочной таблице, а не в родительской таблице?

Я прошу общего понимания / обогащения.

Например, из документов Laravel: если User имеет один Phone, модель Phone, как ожидается, будет иметь внешний ключ user_id.

Это похоже на дополнительную работу для базы данных. do: пойти и найти user_id в таблице Phones, в отличие от phone_id, уже присутствующего в модели User.

Я предполагаю, что применимы следующие три причины - есть ли другие причины, чтобы структурировать его таким образом?

  • Он может использовать уже написанную логику для поиска отношений «есть много» (где очевидно, почему так должно быть). ).
  • Отношение может быть легко «перенесено» в отношение has-many.
  • Это гарантирует, что там, где существует отношение, модель Phone также действительно существует. (В противном случае phone_id в модели User потенциально может указывать на несуществующую запись в таблице Phones.)

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Это похоже на большую работу для базы данных: пойти и найти user_id в таблице Phones по сравнению с phone_id, уже присутствующим в модели User.

Что выздесь упомянуто то, что известно как отношение BelongsTo, и на самом деле это обратное HasOne или HasMany. Это означает, что если у пользователя есть один или несколько телефонов, телефон автоматически принадлежит пользователю через внешний ключ user_id. Это также означает, что телефон будет принадлежать только одному пользователю.

Вы совершенно правы в сходстве между HasOne и HasMany, поскольку они используют внешние ключи точно таким же образом. Фактически, единственное реальное отличие в Eloquent заключается в том, что для HasOne он возвращает первое совпадение в ссылочной таблице, а не все доступные совпадения, как в HasMany.

Обратите внимание, что ваш третий пункт не совсем корректен, поскольку вполне возможно, что user_id в таблице phones не указывает на существующую запись в users, если в вашей базе данных нет ограничений, которые заставляют ваш внешний ключ указывать на существующую запись.

0 голосов
/ 11 октября 2019

Laravel имеет отношение hasOne И отношение belongsTo.

В вашем примере, если A имеет столбец b_id, то A относится к B.

Если B имеет столбец a_id, то A hasOne или hasMany B в зависимости от количества B.

Источники:

https://laravel.com/docs/5.8/eloquent-relationships#one-to-one

Должен ли я использовать принадлежащий или hasOne в Laravel?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...