【发布时间】:2015-07-15 12:57:28
【问题描述】:
考虑两个模型A 和B
A ->relatedTo B 是 one to one 关系
使用 (A ->hasOne-- B) 和 (A ->belongsTo-- B) 有什么区别?
我可以互换使用它们吗?
【问题讨论】:
标签: laravel
考虑两个模型A 和B
A ->relatedTo B 是 one to one 关系
使用 (A ->hasOne-- B) 和 (A ->belongsTo-- B) 有什么区别?
我可以互换使用它们吗?
【问题讨论】:
标签: laravel
不,差异取决于您的外键在哪里。
在您的示例中,如果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。
主要区别如下:
belongsTo 和 belongsToMany - 你是在告诉 Laravel 这个表包含将它连接到另一个表的外键。
hasOne 和 hasMany - 你告诉 Laravel 这个表没有外键。
【讨论】:
belongstoMany(多对多)关系不会将键保留在表本身上,而是保留在数据透视表上。
这与外键的位置无关。
OP提出了2个场景:AhasOneB,AbelongsToB
对于上下文示例,让 A = 用户和 B = 公司。
您可以说“用户拥有(
hasOne) 一家公司”,相反,您可以说“用户在(belongsTo) 一家公司工作”。
在这两种情况下,
user都有一个company_id字段
请稍等片刻。因此,讨论外键的位置是不可能的。最贴切的答案可以在这里找到: https://laravel.io/forum/04-20-2015-belongsto-vs-hasone
虽然有效,但对关系的描述不正确。
回答 OP 的问题:不,您不应该互换使用它们。
它们通常成对使用
belongsToB,BhasManyAbelongsTo A, A hasMany BhasOne B, B hasMany A hasXXX 时出现问题,请参阅链接。【讨论】:
“BelongsTo”与“xxx_id”列一起进入表中。 例子: 一个国家有城市。 一个城市属于一个国家(城市表中的 country_id)。 另一个例子: 一张脸有一个鼻子。 A Nose 属于一张脸(noses 表中的 face_id)。
【讨论】:
表中包含外键的模型将具有belongsTo(),而表中包含该外键引用的主键的模型将具有hasOne()...外键将具有belongsTo(),而在该关系中不包含外键的将具有hasOne()。不,它们是不可互换的,使用错误的方法总是会返回 null。
【讨论】: