提问者:小点点

Laravel中的许多到许多关系:属性To很多()vs. hasMany通过()


在Laravel中定义一个多对多关系时,使用属性多()或hasManyPass()有什么区别?

示例:UserAccountAccount\u User

因此,用户通过Account_User表与帐户有多对多的关系。除了定义具有相关帐户的相关用户的数据透视表之外,它还存储了一个Account_User.role字段,该字段确定给定用户在给定帐户中的角色。

使用User belongtomany()帐户或User hasManyThrough()帐户\u User会有什么影响?或者这本质上是一样的?

当决定一种方法时,我想我应该对反向关系定义使用相同的方法。


共2个答案

匿名用户

假设你有两个模型,我们称AB

如果A可能有一个以上的B,并且如果B可能有一个以上的A(就像博客帖子/标签一样),则必须使用belongstomy()

现在假设您有3个模型,ABC

AB相关,BC相关。但是您需要访问与A相关的所有C(超过B),然后您需要使用hasManyThrough()(就像国家/地区一样-

hasManyThrough()并不完全适用于多对多关系,它更像是一种快捷方式。

检查留档链接,1,2(Laravel 4.2),或3,4(Laravel 5. x)。

匿名用户

虽然@Arda的答案绝对正确,但我发现自己需要一些时间来消化它。所以我试图用更简单的术语来描述同样的事情。

hasManyThrough在类似于以下场景的情况下非常有用:

  • 一家公司有许多办公室,每个办公室都有许多员工在其中工作。换句话说,公司一对多办公室,以及办公室一对多员工。如果您想让所有为某一特定公司工作的员工都参与进来,您需要:
// Company Model

public function employees()
{
    return $this->hasManyThrough('App\Employee', 'App\Office');
}

另一方面,当您与中间的数据透视表存在多对多关系时,belongtomany非常有用。例如:

  • 一部电影可以有许多类别(喜剧、戏剧等),每个类别可以属于许多电影。换句话说,电影多对多类别。如果要获取给定电影的所有类别,则需要:
// Film Model

public function categories()
{
    return $this->belongsToMany('App\Category', 'pivot_table_name');
}

考虑到所讨论的场景,belongtomany是将许多用户连接到许多帐户所需的关系<无法应用代码>hasManyThrough