Orm 拉威尔的多对多关系:归属者()与哈斯曼尼思()之争
在Laravel中定义多对多关系时,使用belongToMany()或hasManyThrough()有什么区别 例如:Orm 拉威尔的多对多关系:归属者()与哈斯曼尼思()之争,orm,laravel,laravel-4,relationship,eloquent,Orm,Laravel,Laravel 4,Relationship,Eloquent,在Laravel中定义多对多关系时,使用belongToMany()或hasManyThrough()有什么区别 例如: 用户 账户 Account\u用户 因此,用户通过Account\u User表与Account有多对多关系。除了定义具有相关帐户的相关用户的透视表之外,它还存储一个Account\u User.role字段,该字段确定给定用户在给定帐户中的角色 使用User belongtomany()帐户或User hasManyThrough()帐户\u User会有什么影响?或者这本
用户
账户
Account\u用户
因此,用户通过Account\u User表与Account有多对多关系。除了定义具有相关帐户的相关用户的透视表之外,它还存储一个Account\u User.role
字段,该字段确定给定用户在给定帐户中的角色
使用User belongtomany()帐户或User hasManyThrough()帐户\u User
会有什么影响?或者这本质上是一样的
当决定使用一种方法时,我想我应该对反向关系定义使用相同的方法。假设您有两个模型,我们调用a
和B
:
如果A
可能有多个B
项,
而且
如果B
可能有一个以上的A
(像博客帖子/标签一样思考)
您必须使用belongtomany()
现在假设您有3种型号,A
、B
和C
A
与B
相关,B
与C
相关。但是您需要访问与A
(通过B
)相关的所有C
,然后您需要使用hasManyThrough()
(想象一下国家
->用户
->帖子
,您需要来自特定国家的所有帖子
)
hasManyThrough()
并不完全适用于多对多关系,它更像是一种快捷方式
查看文档链接(Laravel 4.2)或(Laravel 5.x)。虽然@Arda的答案绝对正确,但我发现自己需要一些时间来消化它。因此,我试图用更简单的术语来解释同样的事情
hasManyThrough
在类似于以下场景的情况下非常有用:
- 一家公司有许多办公室,每个办公室都有许多员工在其中工作。换句话说,
公司
一对多办公室
,以及办公室
一对多员工
。如果您想让所有为某一特定公司工作的员工都参与进来,您需要:
另一方面,当您与中间的数据透视表存在多对多关系时,belongtomany
非常有用。例如:
- 一部电影可以有许多类别(喜剧、戏剧等),每个类别可以属于许多电影。换句话说,
电影
多对多类别
。如果要获取给定电影的所有类别,则需要:
考虑到所讨论的场景,belongtomany
是将许多用户
连接到许多帐户
所需的关系hasManyThrough
无法应用。我理解,因此我更新了问题,使其更加具体。我真的不知道这两种方法的利/弊是什么,或者是否有任何区别。真的没有利/弊,因为它们都在做不同的事情BelongToMany()
通常包括一个数据透视表,hasManyThrough()
只是hasMany
的一个快捷方式,因此,如果你设置了hasManyThrough()
关系,你所需要做的就是countries->posts
;你的方法有很多缺点。消极地说,您必须为透视表添加一个雄辩的模型。正如我在回答中所说的,它们是不同的东西,而对于你的例子来说,有很多东西是不合适的。认为Account_user是Account和user表的一部分,而不像第三个表。
// Company Model
public function employees()
{
return $this->hasManyThrough('App\Employee', 'App\Office');
}
// Film Model
public function categories()
{
return $this->belongsToMany('App\Category', 'pivot_table_name');
}