Laravel中的多对多关系:belongsToMany()vs. hasManyThrough()

pre*_*eyz 18 orm relationship laravel eloquent laravel-4

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

例: User Account Account_User

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

使用其中一个User belongsToMany() AccountUser hasManyThrough() Account Account_User哪个含义会是什么?或者这基本上是一样的吗?

当决定一个方法时,我想我应该使用相同的方法进行反向关系定义.

Ard*_*rda 18

比方说,你有两种模式,我们姑且称之为AB:

如果A可能有多个项目B,也B可能有多个项目A (想像博客文章/标签)你必须使用belongsToMany();

现在让我们假设您有3个型号A,BC.

A与...有关B,与... B有关C.但你需要访问CA(over B)相关的所有内容,然后你需要使用hasManyThrough() (想想countries- > users- > posts,你需要post特定的所有s country)

hasManyThrough() 并不是完全意味着多对多的关系,它更像是一种捷径.

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

  • 确实没有利弊,因为他们都在做不同的事情.`belongsToMany()`通常包含一个数据透视表,`hasManyThrough()`只是`hasMany`的快捷方式,所以如果你设置`hasManyThrough()`关系,而不是'countries-> users-> posts`,所有你需要做的是`countries-> posts`; (4认同)
  • 我理解,所以我将问题更新为更具体。我只是根本不了解这两种方法的优缺点是什么-或根本没有区别。 (2认同)

Mak*_*nov 11

虽然@Arda 的答案是绝对正确的,但我发现自己需要一些时间来消化它。因此,我尝试用更简单的术语来表达同样的事情。

hasManyThrough当您遇到类似于以下场景的情况时非常有用:

  • 一家公司有很多个办公室,每个办公室都有很多员工在里面工作。换句话说,Company一对多OfficeOffice一对多Employee。如果您想获取为给定公司工作的所有员工,您需要:
// Company Model

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

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

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

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

考虑到所讨论的场景,belongsToMany连接多对多所需的关系UsersAccountshasManyThrough不能应用。