sql - 为什么 hasOne 关系中的外键需要在被引用的表中?
问题描述
为什么 Laravel 的 Eloquent 坚持 hasOne 关系中的外键必须在被引用的表中,而不是在父表中?
我要求一般的理解/丰富。
例如,来自 Laravel 文档:如果 aUser
有一个Phone
,则Phone
模型应该有一个user_id
外键。
这似乎是数据库要做的更多工作:去表中查找,而不是user_id
模型中已经存在的。Phones
phone_id
User
我假设以下这三个原因都适用 -还有其他理由以这种方式构建它吗?
- 它可以利用已经编写的逻辑来查找有很多关系(很明显为什么需要这样)。
- 这种关系可以很容易地“迁移”到具有多关系的关系。
- 它保证只要存在关系,
Phone
模型实际上也确实存在。(否则,模型phone_id
中的aUser
可能会指向表中不存在的条目Phones
。)
解决方案
这似乎是数据库要做的更多工作:在 Phones 表中查找 user_id,而不是在 User 模型中已经存在 phone_id。
您在这里提到的是所谓的 BelongsTo 关系,实际上是 HasOne 或 HasMany 的倒数。这意味着如果一个用户有一个或多个电话,电话自动通过user_id
外键属于一个用户。这也意味着电话永远只属于一个用户。
您在 HasOne 和 HasMany 之间的相似之处是完全正确的,因为它们以完全相同的方式使用外键。事实上,Eloquent 中唯一真正的区别在于,对于 HasOne,它返回引用表中的第一个匹配项,而不是像 HasMany 那样返回所有可用的匹配项。
请注意,您的第三点并不完全正确,因为表中的 a 可能user_id
不phones
指向 中的现有条目users
,除非您的数据库中存在强制外键指向现有条目的约束.
推荐阅读
- c++ - 如何传递变量作为对不同矢量分量的引用?
- database - 如何使用 Logstash 将 MongoDB 数据传输到 Elasticsearch?
- google-apps-script - Google 表单上传 + 在自动电子邮件回复中附加上传的 pdf
- android-jetpack-compose - 我如何模拟视图模型以使用撰写预览?
- r - 在 geom_bar() 中突出显示具有非常特定条件的框
- c# - 找不到路径“D:\home\site\wwwroot\DriverImage\image.jfif”的一部分
- python - 如何使用 sphinx 文档在 Confluence 中构建多个页面
- python - 使用 pandas (Python) 从 csv 更新用户选择的单元格
- java - 检测各种类型的不区分大小写的重复项时的 Java 收集器流过滤器和 .toMap
- python - 具有多个条件的 pandas DataFrame 中的数据条件选择