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

时间:2014-02-11 10:20:02

标签: orm laravel laravel-4 relationship eloquent

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

实施例: User Account Account_User

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

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

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

2 个答案:

答案 0 :(得分:15)

假设你有两个型号,我们打电话给AB

如果A可能包含多个B项, 并且 如果B可能包含多个A项 (想像博客文章/标签) 您必须使用belongsToMany();

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

AB相关,BC相关。但是您需要访问与CA)相关的所有B,然后您需要使用hasManyThrough() (请考虑countries - > users - > posts,并且您需要来自特定post的所有country

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

查看文档链接,12(Laravel 4.2)或34(Laravel 5.x)。

答案 1 :(得分:0)

@Arda的答案绝对正确,但是我发现自己需要一些时间来消化它。因此,这是我尝试用简单的术语表示相同的内容。

2019-07-08T10:37:28Z在以下情况下很有用:

    公司有很多办公室,每个办公室都有很多员工在工作。换句话说,final format = new DateFormat.yMMMEd('en-US'); return DateTimeField( format: format, autocorrect: true, autovalidate: false, controller: _bspLicenseExpiryDate, readOnly: true, validator: (date) => date == null ? 'Please enter valid date' : null, decoration: InputDecoration( labelText: "Expiry Date", hintText: "Expiry Date", prefixIcon: Icon( FontAwesomeIcons.calendar, size: 24, )), onShowPicker: (context, currentValue) { return showDatePicker( context: context, firstDate: DateTime.now(), initialDate: currentValue ?? DateTime.now(), lastDate: DateTime(2100), ); }, ); 一对多hasManyThroughCompany一对多Office。而且,如果您想获取在给定公司工作的所有员工,则需要:
Office
另一方面,

Employee在中间有数据透视表的多对多关系中很有用。例如:

  • 电影可以有许多类别(喜剧,戏剧等),每个类别可以属于许多电影。换句话说,// Company Model public function employees() { return $this->hasManyThrough('App\Employee', 'App\Office'); } 多对多belongsToMany。而且,如果您想获取给定电影的所有类别,则需要:
Film

鉴于所讨论的情况,Category是将许多// Film Model public function categories() { return $this->belongsToMany('App\Category', 'pivot_table_name'); } 连接到许多belongsToMany所需要的关系。 Users无法应用。