二十七、PHP框架Laravel学习笔记——模型的多对多关联

二.多对多关联

  1. 多对多关联,比前面两种要复杂一些,需要一张中间表,共三张;
    在这里插入图片描述
    在这里插入图片描述

(1) .users:用户表;
(2) .roles:权限表;
(3) .role_user:中间表:默认表名,user_id,role_id,默认外键可不指明;

  1. 创建权限表:Role.php,留空;在 User.php 设置多对多关联;
    //多对多关联
public function role() { 
	return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id'); 
}

在这里插入图片描述

PS:参数 2 传中间表名,参数 3,4 如果是默认值,则可不传;

  1. 多对多关联输出,查看用户都拥有哪些权限;
$roles = User::find(19)->role; 
return $roles; 

在这里插入图片描述

  1. 获取权限列表中某一个数据,和一对多操作方法一样,但注意返回的表名称;
    //注意,多对多这里 role()返回的是 role_user 表
    //可以通过 dd($roles)查看,所以,where 需要用 role_id 来指明
$roles = User::find(19)->role()->where('role_id', 1)->get(); 
return $roles; 

在这里插入图片描述

//当然,你也可以使用集合的方式去实现筛选

$roles = User::find(19)->role; 
return $roles->where('id', 1);

在这里插入图片描述

  1. 多对多的反向关联和其它两种方式也差不多;
    //反向多对多关联,后面 id 是反的
public function user() { 
	return $this->belongsToMany(User::class, 'role_user', 'role_id', 'user_id'); 
}
$users = Role::find(1)->user; 
return $users; 

在这里插入图片描述

  1. 多对多会生成一个中间字段:pivot,里面包含多对多的双 id;
  2. 如果想要 pivot 字段包含更多的中间表字段,可以自行添加,还可以修改字段名;
return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id') 
		->withPivot('details', 'id') ->as('pivot_name'); 

在这里插入图片描述

  1. 定义多对多绑定时,可以在绑定方法内筛选数据;
$this->belongsToMany(Role::class) ... ->wherePivot('id', 1); 

在这里插入图片描述

PS:还有 wherePivotIn,以及派生的四种方法;
PS:除了一对一,一对多,多对多,还有派生的远程一对一,远程一对多,以及多态一对一, 多态一对多,多态多对多。这些更多的扩展,暂时不纳入基础的核心课程,防止过于繁杂冗余 导致劝退。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值