多对对关系

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

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

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

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

课程表:

课程表course

id 整型 课程id主键自增
course_name varchar 课程名称
score tinyint 课程学分

选课信息表:

选课信息表 user_course

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

用户表:

guest表

字段名 类型 说明
id int 主键自增
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());}
    }
    

Laravel中的多对多关系相关推荐

  1. laravel中的多对多关系详解

    一种常见的关联关系是多对多,即表A的某条记录通过中间表C与表B的多条记录关联,反之亦然.比如一个用户有多种角色,反之一个角色对应多个用户.为了测试该关联关系,我们沿用官网的用户角色示例: 需要三张数据 ...

  2. 数据库设计中,多对多关系使用使用逗号分割关联讨论

    进公司一个月,发现公司很多人喜欢用逗号分割,去存储其它表的主键,做多对多关联,但存在很多乱用现象.这里对这种方式做了下总结. 在传统数据库设计中,多对多关系存储通常都是用一张中间表来简历两张表的关系. ...

  3. ssas对数据仓库_SSAS中的多对多关系简介

    ssas对数据仓库 In this article, I'm going to explain what many-to-many relationships in SSAS are and how ...

  4. 什么是数据库中的多对多关系?

    什么是数据库建模中的多对多关系?如何在数据库中实现这种关系?本文中的示例将回答这些问题. 多对多关系可能是在数据库中显示的最棘手的关系.因此,我在本文中的第一步将是解释它们是什么.然后,我将继续给你几 ...

  5. mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...

    一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...

  6. java中的多对多关系解析_Java中多对多映射关系(转)

    多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...

  7. java中的多对多关系解析_Java中多对多映射关系

    多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...

  8. NHibernate之旅(11):探索多对多关系及其关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  9. Flask 数据库多对多关系

    数据库使用关系建立记录之间的联系.其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起.实现这种关系时,要在"多"这一侧加入一个外键,指向"一&qu ...

最新文章

  1. Python 网络爬虫笔记11 -- Scrapy 实战
  2. 设计模式:享元模式(Flyweight)
  3. 为何采用双亲委派机制
  4. 【linux】linux系统配置静态IP地址(超详细,手把手教会)
  5. 【转】C#检查键盘大小写锁定状态的方法
  6. 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...
  7. cefsharp作为采集工具(学习笔记)
  8. 1.2 安装 docker 容器并配置镜像加速器
  9. 《信号与系统学习笔记》—信号与系统的时域和频域特性(一)
  10. 黑客是如何监视女友出轨信息的,痛心的经历!
  11. Kinect2.0相机标定
  12. 【干货】PS 如何快速抠图示例
  13. Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  14. Google Chrome自定义新标签页
  15. excel中单元格的绝对引用和相对引用
  16. iOS直播实用篇(手把手教)
  17. 年薪60万+?这份10万字的面试突击宝典涵盖阿里 P5 工程师~P7 所有技术栈
  18. SpringBoot成长笔记(一)环境搭建
  19. python turtle画彩虹的代码_Python利用turtle库绘制彩虹代码示例
  20. 加拿大:国家资助研究项目IRAP已自主研发区块链浏览器

热门文章

  1. 实验05:算法设计策略的比较与选择
  2. 02【ArcGIS Pro SDK for Microsoft .NET】开发实现登录页面
  3. (一)Qt+OpenCV调用海康工业相机SDK示例开发
  4. 微信浏览器中打开QQ聊天QQ群
  5. 银行卡基础知识 - I类-II类-III类账户
  6. C++实现生产者和消费者模型
  7. ESP32设备驱动-DS3231实时时钟(RTC)驱动
  8. 小程序/公众号抽奖活动页面-逻辑
  9. 【ZZULIOJ】1091: 童年生活二三事(多实例测试)
  10. Qt中将数字以2进制、16进制等方式转成QString的方法