在Laravel中定义多对多关系时使用belongsToMany()或hasManyThrough()有什么区别?
实施例:
User
Account
Account_User
因此,用户通过Account_User表与Account有很多关系。除了仅定义具有相关帐户的相关用户的数据透视表外,它还存储Account_User.role
字段,该字段确定给定用户在给定帐户中具有哪个角色。
使用User belongsToMany() Account
或User hasManyThrough() Account Account_User
会带来什么影响?或者这基本上是一样的吗?
当决定一个方法时,我想我应该使用相同的方法进行反向关系定义。
答案 0 :(得分:15)
假设你有两个型号,我们打电话给A
和B
:
如果A
可能包含多个B
项,
并且
如果B
可能包含多个A
项
(想像博客文章/标签)
您必须使用belongsToMany()
;
现在假设您有3个模型,A
,B
和C
。
A
与B
相关,B
与C
相关。但是您需要访问与C
(A
)相关的所有B
,然后您需要使用hasManyThrough()
(请考虑countries
- > users
- > posts
,并且您需要来自特定post
的所有country
hasManyThrough()
并非完全适用于多对多关系,它更像是一种捷径。
答案 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),
);
},
);
一对多hasManyThrough
和Company
一对多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
无法应用。