【问题标题】:Should i use belongsTo or hasOne in Laravel?我应该在 Laravel 中使用 belongsTo 还是 hasOne?
【发布时间】:2015-07-15 12:57:28
【问题描述】:

考虑两个模型AB

A ->relatedTo Bone to one 关系

使用 (A ->hasOne-- B) 和 (A ->belongsTo-- B) 有什么区别?

我可以互换使用它们吗?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    不,差异取决于您的外键在哪里。

    在您的示例中,如果A 有一个b_id 列,那么A belongsTo B

    如果B 有一个a_id 列,那么A hasOnehasMany B 取决于B 应该有多少。

    【讨论】:

    • 谢谢。你是唯一一个根据钥匙的位置来解释它的人。其他人都试图用“英语”来解释它,但有时你的模型太抽象了,以至于没有意义。
    • 不能B 也不能BelongTo A?
    • 假设Ab_id 列。在这种情况下,我可以使用A.belongsTo(b)B.hasOne(A)。在这两种情况下,ORM 都会将b_id 添加到A 表中。那么,这里有什么不同呢?请解释一下好吗?
    • 这两种关系正好相反。你是对的,它们基本上是一样的。但是,如果您需要查询B,但您所拥有的只是A 的ID,那么设置两者很有用,那么您需要执行A::find($id)->B 之类的操作,这将使用A.belongsTo(b) 关系。相反,如果您需要查询A,但您所拥有的只是B 的ID,那么您需要B.hasOne(A) 关系B::find($id)->A
    • 这个问题具体是关于 hasOne 和 belongsTo 之间的区别。
    【解决方案2】:

    主要区别如下:

    belongsTobelongsToMany - 你是在告诉 Laravel 这个表包含将它连接到另一个表的外键。

    hasOnehasMany - 你告诉 Laravel 这个表没有外键。

    【讨论】:

    • 我认为您的回答更简单易懂。谢谢!
    • 我认为这并不完全正确。 belongstoMany(多对多)关系不会将键保留在表本身上,而是保留在数据透视表上。
    • 很好的答案,这有助于理解函数名称背后的逻辑。
    【解决方案3】:

    这与外键的位置无关。

    OP提出了2个场景:AhasOneB,AbelongsToB

    对于上下文示例,让 A = 用户和 B = 公司。

    您可以说“用户拥有(hasOne) 一家公司”,相反,您可以说“用户在(belongsTo) 一家公司工作”。

    在这两种情况下,user 都有一个 company_id 字段

    请稍等片刻。因此,讨论外键的位置是不可能的。最贴切的答案可以在这里找到: https://laravel.io/forum/04-20-2015-belongsto-vs-hasone

    虽然有效,但对关系的描述不正确。

    回答 OP 的问题:不,您不应该互换使用它们

    它们通常成对使用

    1. AbelongsToB,BhasManyA
    2. B belongsTo A, A hasMany B
    3. A hasOne B, B hasMany A hasXXX 时出现问题,请参阅链接。

    【讨论】:

      【解决方案4】:

      “BelongsTo”与“xxx_id”列一起进入表中。 例子: 一个国家有城市。 一个城市属于一个国家(城市表中的 country_id)。 另一个例子: 一张脸有一个鼻子。 A Nose 属于一张脸(noses 表中的 face_id)。

      【讨论】:

        【解决方案5】:

        表中包含外键的模型将具有belongsTo(),而表中包含该外键引用的主键的模型将具有hasOne()...外键将具有belongsTo(),而在该关系中不包含外键的将具有hasOne()。不,它们是不可互换的,使用错误的方法总是会返回 null。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-11
          • 1970-01-01
          • 2016-02-11
          • 2016-10-01
          • 2018-09-25
          • 1970-01-01
          • 2017-06-24
          • 1970-01-01
          相关资源
          最近更新 更多