Orm 拉威尔的多对多关系:归属者()与哈斯曼尼思()之争

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会有什么影响?或者这本

在Laravel中定义多对多关系时,使用belongToMany()或hasManyThrough()有什么区别

例如:
用户
账户
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');
}