我应该在 Laravel 中使用 belongsTo 还是 hasOne?

Posted

技术标签:

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

考虑两个模型AB

A ->relatedTo Bone to one 关系

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

我可以互换使用它们吗?

【问题讨论】:

【参考方案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 的问题:不,您不应该互换使用它们

它们通常成对使用

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于我应该在 Laravel 中使用 belongsTo 还是 hasOne?的主要内容,如果未能解决你的问题,请参考以下文章

我应该还是不应该在 Laravel Passport 中使用带有密码授予授权的刷新令牌?

我应该在 Laravel 中使用 belongsTo 还是 hasOne?

我应该避免在 Laravel 项目中使用数据库视图吗?

我应该如何使用 Laravel 提供图像?

Laravel 数据库,我应该使用啥数据类型来存储护照号码?

我应该在 Laravel 5.7 中更好地使用 session() 或 collect() 辅助函数吗?