考虑两个模型A
和B
A
- > relatedTo B
是one to one
关系
使用(A - > hasOne
- B)和(A - > belongsTo
- B)有什么区别?
我可以互换使用吗?
答案 0 :(得分:91)
不,差异取决于外键的位置。
在您的示例中,如果A
有b_id
列,则A
belongsTo
B
。
如果B
有a_id
列,那么A
hasOne
或hasMany
B
取决于B
应该有多少 require(jsonlite)
> as.data.frame( fromJSON(test, simplifyVector=FALSE ) )
count subject.name subject.alpha2
1 1 Namibia NA
> str( as.data.frame( fromJSON(test, simplifyVector=FALSE ) ) )
'data.frame': 1 obs. of 3 variables:
$ count : int 1
$ subject.name : Factor w/ 1 level "Namibia": 1
$ subject.alpha2: Factor w/ 1 level "NA": 1
> str( as.data.frame( fromJSON(test, simplifyVector=FALSE ) ,stringsAsFactors=FALSE) )
'data.frame': 1 obs. of 3 variables:
$ count : int 1
$ subject.name : chr "Namibia"
$ subject.alpha2: chr "NA"
有。
答案 1 :(得分:12)
主要区别如下:
belongsTo 和 belongsToMany ,您告诉Laravel该表持有将其连接到另一个表的外键
hasOne 和 hasMany 告诉Laravel该表没有外键
答案 2 :(得分:0)
表的表包含外键的模型中将具有belongsTo(),而表的表包含外键所引用的主键将具有hasOne()。外键将具有belongsTo(),而在该关系中不包含外键的将具有hasOne()。不,使用错误的方法不能互换它们,结果总是返回null。
答案 3 :(得分:0)
这与外键在哪里无关。
OP 提出了 2 个场景:A hasOne
B、A belongsTo
B
对于上下文示例,让 A = 用户,B = 公司。
<块引用>您可以说“user owns(hasOne
) a company”,相反您可以说“userworksAt(belongsTo
) a company”。
在这两种情况下,user
都有一个 company_id
字段
请稍等片刻。因此,讨论外键的位置是不可能的。最恰当的答案可以在这里找到: https://laravel.io/forum/04-20-2015-belongsto-vs-hasone
<块引用>虽然有效,但对关系的描述不正确。
回答 OP 的问题:不,您不应该互换使用它们。
它们通常成对使用
belongsTo
B, B hasMany
AbelongsTo
A, A hasMany
BhasOne
B, B hasMany
A <- 这将导致双方使用 hasXXX
时出现问题,请参阅链接。