Laravel中的多对多关系
多对对关系
多对多的关系比一对一和一对多关系稍微复杂些。
如:
一个用户可以选择多门课程,一个课程可以被多个用户选择。
用户表和课程表之间就是一个多对多的关系;
一个用户可以拥有多个角色,一个角色可以被多个用户拥有;多对多的关系需要一个中间关系表来体现,如选课信息表。该表中记录哪个用户选了哪些课程信息。
多对多关系的创建语法:
多对多的关系不区分正向和反向
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表的多对多关系:
- 创建 course表的model模型类,guest表的model模型类:
php artisan make:model Course
php artisan make:model Guest
- 对两个模型类进行初始化设置:
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");} }
- 需求示例:
创建一个控制器类:php artisan make:controller testControllers
- 查询某个用户选择的所有课程信息:
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
表在中间表的对应字段值 - 某个用户选择的课程数
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中的多对多关系相关推荐
- laravel中的多对多关系详解
一种常见的关联关系是多对多,即表A的某条记录通过中间表C与表B的多条记录关联,反之亦然.比如一个用户有多种角色,反之一个角色对应多个用户.为了测试该关联关系,我们沿用官网的用户角色示例: 需要三张数据 ...
- 数据库设计中,多对多关系使用使用逗号分割关联讨论
进公司一个月,发现公司很多人喜欢用逗号分割,去存储其它表的主键,做多对多关联,但存在很多乱用现象.这里对这种方式做了下总结. 在传统数据库设计中,多对多关系存储通常都是用一张中间表来简历两张表的关系. ...
- ssas对数据仓库_SSAS中的多对多关系简介
ssas对数据仓库 In this article, I'm going to explain what many-to-many relationships in SSAS are and how ...
- 什么是数据库中的多对多关系?
什么是数据库建模中的多对多关系?如何在数据库中实现这种关系?本文中的示例将回答这些问题. 多对多关系可能是在数据库中显示的最棘手的关系.因此,我在本文中的第一步将是解释它们是什么.然后,我将继续给你几 ...
- mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...
一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...
- java中的多对多关系解析_Java中多对多映射关系(转)
多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...
- java中的多对多关系解析_Java中多对多映射关系
多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...
- NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- Flask 数据库多对多关系
数据库使用关系建立记录之间的联系.其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起.实现这种关系时,要在"多"这一侧加入一个外键,指向"一&qu ...
最新文章
- Python 网络爬虫笔记11 -- Scrapy 实战
- 设计模式:享元模式(Flyweight)
- 为何采用双亲委派机制
- 【linux】linux系统配置静态IP地址(超详细,手把手教会)
- 【转】C#检查键盘大小写锁定状态的方法
- 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...
- cefsharp作为采集工具(学习笔记)
- 1.2 安装 docker 容器并配置镜像加速器
- 《信号与系统学习笔记》—信号与系统的时域和频域特性(一)
- 黑客是如何监视女友出轨信息的,痛心的经历!
- Kinect2.0相机标定
- 【干货】PS 如何快速抠图示例
- Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
- Google Chrome自定义新标签页
- excel中单元格的绝对引用和相对引用
- iOS直播实用篇(手把手教)
- 年薪60万+?这份10万字的面试突击宝典涵盖阿里 P5 工程师~P7 所有技术栈
- SpringBoot成长笔记(一)环境搭建
- python turtle画彩虹的代码_Python利用turtle库绘制彩虹代码示例
- 加拿大:国家资助研究项目IRAP已自主研发区块链浏览器