2014-02-11 134 views
12

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

例子: User Account Account_User

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

使用User belongsToMany() AccountUser hasManyThrough() Account Account_User会产生什么影响?或者这基本上是一样的?

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

+0

有许多通过不适合您的方法。消极的是,你将不得不为透视表添加一个Eloquent模型。正如我在回答中所说的那样,它们是不同的东西,对于你的例子来说,很多通过并不合适。认为Account_user是帐户和用户表的一部分,不像第三个表。 – Arda

回答

12

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

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

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

ABB有关C。但是,你需要访问这是关系到A(超过B)所有C的,那么你需要使用hasManyThrough() (认为像countries - >users - >posts,你需要从特定country所有post S)

hasManyThrough()并不完全适用于多对多的关系,它更像是一条捷径。

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

+1

我明白了,所以我更新了更具体的问题。我根本没有真正明白这两种方法的优点/缺点 - 或者根本不同。 – preyz

+3

真的没有优点和缺点,因为它们都在做不同的事情。 'belongsToMany()'通常包含一个数据透视表,'hasManyThrough()'只是'hasMany'的一个快捷方式,所以如果你设置了'hasManyThrough()'关系,而不是'countries-> users-> posts',所有你需要做的是'countries-> posts'; – user3158900