- 多对多关联
- 多对多关联,比前面两种要复杂一些,需要一张中间表,共三张:
(1) .users: 用户表;
(2) .roles: 权限表;
(3) .role_user: 中间表:默认表名,user_id,role_id,默认外键可不指明;
b. 创建权限表:Role.php,留空:在User.php设置多对多关联;
//多对多关联
public function role(){
return $this->belongsToMany(Role::class, ‘role_user’, ‘user_id’, ‘role_id’, ‘id’);
}
PS: 参数2传中间表名,参数3,4如果是默认值,则可不传;
c. 多对多关联输出,查看用户都拥有哪些权限
$roles = User::find(20)->role;
return $roles;
d. 获取权限列表中某一个数据,和一对多操作方法一样,但注意返回的表名称;
//注意,多对多这里role()返回的是role_user表
//可以通过dd($roles)查看,所以,where需要用role_id来指明
$roles = User::find(20)->role()->where(‘role_id’, 1)->get();
return $roles;
//当然,你也可以使用集合的方式去实现筛选
$roles = User::find(20)->role;
return $roles->where(‘id’, 1);
e. 多对多的反向关联和其它两种方式差不多;
//反向多对多关联,后面id是反的
public function user(){
return $this->belongsToMany(User::class);
}
$users = Role::find(1)->user;
return $users->where(‘username’, ‘路飞’);
f. 多对多会生成一个中间字段:pivot,里面包含多对多的双id,在;
g. 如果想要pivot字段包含更多的中间表字段,可以自行添加,还可以修改字段名:
public function role(){
return $this->belongsToMany(Role::class, ‘role_user’, ‘user_id’, ‘role_id’, ‘id’)
->withPivot(‘id’, ‘details’) //添加字段
->as(‘pivot_name’); //修改pivot字段名
}
h. 定义多对多绑定时,可以在绑定方法内筛选数据:
public function role(){
return $this->belongsToMany(Role::class, ‘role_user’, ‘user_id’, ‘role_id’, ‘id’)
->withPivot(‘id’, ‘details’)
->wherePivot(‘id’, 1);
}
Ps: 还有wherePivotIn, 以及派生的四种方法
Ps:除了一对一,一对多,多对多,还有派生的远程一对一,远程一对多,以及多状态一对一,
多态一对多,多态多对多。这些更多的扩展,暂时不纳入基础的核心课程,防止过于繁杂冗余导致劝退