我应该在 Laravel 中使用 belongsTo 还是 hasOne?
Posted
技术标签:
【中文标题】我应该在 Laravel 中使用 belongsTo 还是 hasOne?【英文标题】:Should i use belongsTo or hasOne in Laravel? 【发布时间】:2015-07-15 12:57:28 【问题描述】:考虑两个模型A
和B
A
->relatedTo B
是 one to one
关系
使用 (A ->hasOne
-- B) 和 (A ->belongsTo
-- B) 有什么区别?
我可以互换使用它们吗?
【问题讨论】:
【参考方案1】:不,差异取决于您的外键在哪里。
在您的示例中,如果A
有一个b_id
列,那么A
belongsTo
B
。
如果B
有一个a_id
列,那么A
hasOne
或hasMany
B
取决于B
应该有多少。
【讨论】:
谢谢。你是唯一一个根据钥匙的位置来解释它的人。其他人都试图用“英语”来解释它,但有时你的模型太抽象了,以至于没有意义。 不能B
也不能BelongTo
A
?
假设A
有b_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】:
主要区别如下:
belongsTo
和 belongsToMany
- 你是在告诉 Laravel 这个表包含将它连接到另一个表的外键。
hasOne
和 hasMany
- 你告诉 Laravel 这个表没有外键。
【讨论】:
我认为您的回答更简单易懂。谢谢! 我认为这并不完全正确。belongstoMany
(多对多)关系不会将键保留在表本身上,而是保留在数据透视表上。
很好的答案,这有助于理解函数名称背后的逻辑。【参考方案3】:
这与外键的位置无关。
OP提出了2个场景:AhasOne
B,AbelongsTo
B
对于上下文示例,让 A = 用户和 B = 公司。
您可以说“用户拥有(
hasOne
) 一家公司”,相反,您可以说“用户在(belongsTo
) 一家公司工作”。
在这两种情况下,
user
都有一个company_id
字段
请稍等片刻。因此,讨论外键的位置是不可能的。最贴切的答案可以在这里找到: https://laravel.io/forum/04-20-2015-belongsto-vs-hasone
虽然有效,但对关系的描述不正确。
回答 OP 的问题:不,您不应该互换使用它们。
它们通常成对使用
-
A
belongsTo
B,BhasMany
A
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?