Laravel中的多对多关系

多对对关系

多对多的关系比一对一和一对多关系稍微复杂些。
如:
一个用户可以选择多门课程,一个课程可以被多个用户选择
用户表和课程表之间就是一个多对多的关系;
一个用户可以拥有多个角色,一个角色可以被多个用户拥有;多对多的关系需要一个中间关系表来体现,如选课信息表。该表中记录哪个用户选了哪些课程信息。
多对多关系的创建语法:

多对多的关系不区分正向和反向

return $this -> belongsToMany(
被关联的模型 , 多对多模型的关系表名 , 中间表与当前模型关联的字段名 , 中间表与被关联模型关联的字段名);

示例:创建一个课程表和选课信息表如下:

课程表:

课程表course

id整型课程id主键自增
course_namevarchar课程名称
scoretinyint课程学分

选课信息表:

选课信息表 user_course

id整型选课信息表主键自增
user_id整型用户id外键
course_id整型课程id外键

用户表:

guest表

字段名类型说明
idint主键自增
username字符串(20)用户名
password字符串(20)密码

示例1:
建立 course表和guest表的多对多关系:

  1. 创建 course表的model模型类,guest表的model模型类:
    php artisan make:model Course
    php artisan make:model Guest
  2. 对两个模型类进行初始化设置:
    Course 模型类:
    class Course extends Model
    {
        use HasFactory;
        // 对模型初始化
        protected $table = "course";
        public $timestamps = false;
        // 建立关联关系
        public function guest(){
            // 后面的需要外键顺序是跟对应model相反的。
            // 参数说明(关联表类,中间表名,当前model表的中间表对应字段,关联表的中间表对应字段)
            return $this->belongsToMany(Guest::class,"user_course","course_id","user_id");
        }
    }	
    
    Guest 模型类:
    class Guest extends Model
    {
        use HasFactory;
        protected $table = 'guest';
        public $timestamps = false;	
            public function course(){
            return $this->belongsToMany(Course::class,"user_course","user_id","course_id");
        }
    }
    
  3. 需求示例:
    创建一个控制器类:php artisan make:controller testControllers
    1. 查询某个用户选择的所有课程信息:
      class testController extends Controller
      {
          
          public function getOne(){
          // 获取用户名为admin的用户对应课程信息
              $C_info = Guest::firstwhere("username","yumei")->course;
              foreach ($C_info as $v){
                  dump($v->toArray());
              }
      }
      
      在这里插入图片描述
      发现里面多了一个pivot字段,里面放着的是,guest 表和 course 表在中间表的对应字段值
    2. 某个用户选择的课程数
      class testController extends Controller
      {
      	public function getOne(){
      	// 获取用户名为admin的用户对应课程信息
      	$C_info = Guest::firstwhere("username","yumei")->course;
      	// 查看个数
          // 方法一 直接统计数组个数:
          echo $C_info->count();
          // 方法二:统计每个用户的选课个数:会多出一个course_count字段
          $C_info = Guest::withCount('course')->get();
          foreach ($C_info as $v){
              dump($v->toArray());
          }
      }
      
    在这里插入图片描述
    3. 选修某门课程的人数
    class testController extends Controller
    {
    	public function getOne(){
    	//方法一: 获取UI设计课程对应的guest用户
        $P_course = Course::firstwhere("course_name","UI设计")->guest;
        // 循环遍历
        foreach ($P_course as $v)
        {
        	dump($v->toArray());
        }
        // 统计个数
        echo $P_course->count();
        // 方法二:直接用withCount统计course表中的数据,和guest表对应的个数,再通过where筛选出UI设计课程的结果
        $P_course = Course::withCount("guest")->where("course_name","UI设计")->get();
        foreach($P_course as $value)
        {
        	dump($value->toArray());
        }
    }
    
    在这里插入图片描述
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值