首页 > 解决方案 > 为什么 hasOne 关系中的外键需要在被引用的表中?

问题描述

为什么 Laravel 的 Eloquent 坚持 hasOne 关系中的外键必须在被引用的表中,而不是在父表中?

我要求一般的理解/丰富。

例如,来自 Laravel 文档:如果 aUser有一个Phone,则Phone模型应该有一个user_id外键。

这似乎是数据库要做的更多工作:去表中查找,而不是user_id模型中已经存在的。Phonesphone_idUser

我假设以下这三个原因都适用 -还有其他理由以这种方式构建它吗?

标签: sqllaraveleloquent

解决方案


这似乎是数据库要做的更多工作:在 Phones 表中查找 user_id,而不是在 User 模型中已经存在 phone_id。

您在这里提到的是所谓的 BelongsTo 关系,实际上是 HasOne 或 HasMany 的倒数。这意味着如果一个用户有一个或多个电话,电话自动通过user_id外键属于一个用户。这也意味着电话永远只属于一个用户。

您在 HasOne 和 HasMany 之间的相似之处是完全正确的,因为它们以完全相同的方式使用外键。事实上,Eloquent 中唯一真正的区别在于,对于 HasOne,它返回引用表中的第一个匹配项,而不是像 HasMany 那样返回所有可用的匹配项。

请注意,您的第三点并不完全正确,因为表中的 a 可能user_idphones指向 中的现有条目users,除非您的数据库中存在强制外键指向现有条目的约束.


推荐阅读