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

时间:2015-05-05 16:56:13

标签: laravel

考虑两个模型AB

A - > relatedTo Bone to one关系

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

我可以互换使用吗?

4 个答案:

答案 0 :(得分:91)

不,差异取决于外键的位置。

在您的示例中,如果Ab_id列,则A belongsTo B

如果Ba_id列,那么A hasOnehasMany 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 的问题:不,您不应该互换使用它们

它们通常成对使用

  1. A belongsTo B, B hasMany A
  2. B belongsTo A, A hasMany B
  3. A hasOne B, B hasMany A <- 这将导致双方使用 hasXXX 时出现问题,请参阅链接。