【问题标题】:Why does the foreign key in a hasOne relationship need to be in the referenced table?为什么 hasOne 关系中的外键需要在被引用的表中?
【发布时间】:2020-02-08 23:34:24
【问题描述】:

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

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

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

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

我假设以下这三个原因都适用 - 还有其他原因可以这样构建它吗?

  • 它可以利用已经编写的逻辑来查找 has-many 关系(很明显为什么需要这样)。
  • 可以轻松地将关系“迁移”到 has-many 关系。
  • 它保证只要存在关系,Phone 模型实际上也确实存在。 (否则,User 模型中的 phone_id 可能会指向 Phones 表中不存在的条目。)

【问题讨论】:

  • 阅读量较大,但请查看en.wikipedia.org/wiki/Database_normalization。您所描述的与其说是 Laravel 问题,不如说是数据设计问题。简而言之,如果您在同一个表中有外部 id,它“属于另一条记录”,但如果本地键在外部表中,则该记录“有一个/许多其他记录”。跨度>

标签: sql laravel eloquent


【解决方案1】:

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

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

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

请注意,您的第三点并不完全正确,因为 phones 表中的 user_id 可能不指向 users 中的现有条目,除非您的db 强制您的外键指向现有条目。

【讨论】:

  • 这也意味着一个电话永远只属于一个用户。这是对为什么这样做的精明见解。谢谢。
【解决方案2】:

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

Should i use belongsTo or hasOne in Laravel?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多