laravel关联查询
1.创建表:
-- 创建学生表
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '姓名',
`age` tinyint(3) NOT NULL DEFAULT '0' COMMENT '年龄',
`sex` tinyint(3) NOT NULL DEFAULT '0' COMMENT '性别,0:未知,1:男,2:女',
`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生表'; INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (3, '小王', 18, 2, 1641469262, 1641469262);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (10, '小张', 18, 1, 1641469804, 1641529381);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (11, '小李', 19, 1, 1641469904, 1641529381);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (14, '小朱', 19, 1, 1641525262, 1641529381);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (15, '小杜', 18, 1, 1641526322, 1641529381);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (17, '小梁', 17, 1, 1641526483, 1641529381);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (18, '小吴', 18, 1, 1641527008, 1641529381);
INSERT INTO `student`(`id`, `name`, `age`, `sex`, `created_at`, `updated_at`) VALUES (19, '小周', 17, 1, 1641527008, 1641529381); -- 创建学生信息表
CREATE TABLE `student_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`student_id` int(11) NOT NULL DEFAULT '0' COMMENT '学生id',
`email` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '邮箱',
`address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '地址',
`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生信息表'; INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (1, 3, 'test3@test.com', '山东省济南市历下区', 1642404313, 1642404313);
INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (2, 10, 'test10@test.com', '天津市南开区', 1642404313, 1642404313);
INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (3, 11, 'test11@test.com', '河北省石家庄市裕华区', 1642404313, 1642404313);
INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (4, 14, 'test14@test.com', '河北省廊坊市广阳区', 1642404313, 1642404313);
INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (5, 15, 'test15@test.com', '山东省青岛市南市区', 1642404313, 1642404313);
INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (6, 17, 'test17@test.com', '河南省郑州市中原区', 1642404313, 1642404313);
INSERT INTO `student_info`(`id`, `student_id`, `email`, `address`, `created_at`, `updated_at`) VALUES (7, 18, 'test18@test.com', '河南省南阳市卧龙区', 1642404313, 1642404313); -- 创建考试结果表
CREATE TABLE `exam` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`exam_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '科目',
`fraction` decimal(5,2) NOT NULL DEFAULT '0.00' COMMENT '考试成绩',
`student_id` int(11) NOT NULL DEFAULT '0' COMMENT '学生id',
`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='考试结果表'; INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (1, '数学', 67.00, 3, 1642402349, 1642402349);
INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (2, '数学', 100.00, 10, 1642402349, 1642402349);
INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (3, '数学', 98.00, 11, 1642402349, 1642402349);
INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (4, '数学', 63.00, 14, 1642402349, 1642402349);
INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (5, '数学', 96.00, 15, 1642402349, 1642402349);
INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (6, '数学', 78.00, 17, 1642402349, 1642402349);
INSERT INTO `exam`(`id`, `exam_name`, `fraction`, `student_id`, `created_at`, `updated_at`) VALUES (7, '数学', 77.00, 18, 1642402349, 1642402349); -- 创建创建角色表
CREATE TABLE `roles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '角色名称',
`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表'; INSERT INTO `roles`(`id`, `role_name`, `created_at`, `updated_at`) VALUES (1, '班长', 1642411155, 1642411155);
INSERT INTO `roles`(`id`, `role_name`, `created_at`, `updated_at`) VALUES (2, '副班长', 1642411155, 1642411155);
INSERT INTO `roles`(`id`, `role_name`, `created_at`, `updated_at`) VALUES (3, '班委', 1642411155, 1642411155);
INSERT INTO `roles`(`id`, `role_name`, `created_at`, `updated_at`) VALUES (4, '课代表', 1642411155, 1642411155); -- 创建学生角色表
CREATE TABLE `student_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id',
`student_id` int(11) NOT NULL DEFAULT '0' COMMENT '学生id',
`created_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生角色表'; INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (1, 1, 3, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (2, 2, 10, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (3, 3, 11, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (4, 4, 14, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (5, 4, 15, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (6, 4, 17, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (7, 4, 18, 1642413366, 1642413366);
INSERT INTO `student_role`(`id`, `role_id`, `student_id`, `created_at`, `updated_at`) VALUES (8, 4, 3, 1642413366, 1642413366);
2.一对一关联查询:
//student表一对一正向关联student_info表:在student表model中添加关联方法:
public function studentInfo() {
return $this->hasOne(StudentInfo::class, 'student_id', 'id');
}
//查询数据:
$list = Student::find(20)->studentInfo; //student_info表一对一反向关联student表:在student_info表model中添加关联方法:
public function student() {
return $this->belongsTo(Student::class, 'student_id', 'id');
}
//查询数据:
$list = StudentInfo::find(3)->student;
3.一对多关联查询:
//student表一对多正向关联exam表:在student表model中添加关联方法:
public function exam() {
return $this->hasMany(Exam::class, 'student_id', 'id');
}
//查询数据:
$list = Student::find(3)->exam; //一对多,不带查询条件
$list = Student::find(3)->exam()->where('fraction', '>=', 80)->get(); //一对多,带查询条件 //student表一对多反向关联exam表:在exam表model中添加关联方法:
public function student() {
return $this->belongsTo(Student::class, 'student_id', 'id');
}
//查询数据:
$list = Exam::find(3)->student;
4.多对多关联查询:
//student表多对多关联roles表(通过student_role中间表进行关联,student_id和role_id字段为student_role表中的字段):在student表model中添加关联方法:
public function roles() {
return $this->belongsToMany(Roles::class, 'student_role', 'student_id', 'role_id');
} //查询数据:
$list = Student::find(3)->roles; //可以将SQL语句打印出来查看下是否正确
$sql = Student::find(3)->roles()->toSql(); //增加查询条件:
$list = Student::find(3)->roles()->where(function($query) {
$query->where('role_name', '课代表');
})->get(); //has:判断student表与roles表是否存在关联数据。参数一为model名,当前查询信息为student与role表存在关联数据小于1的,若只写roles参数,则默认为大于等于1。
$list = Student::has('roles', '>', 1)->get(); //whereHas:使用闭包组合查询条件
$list = Student::whereHas('roles', function ($query) {
$query->where('role_name', '班长');
})->get(); //doesntHave,has的反向操作,判断student表与roles表不存在关联的数据。
$list = Student::doesntHave('roles')->get(); //withCount:统计student表每条数据与roles表关联数据数量
$list = Student::withCount('roles')->get();
//doesntHave使用时设置别名,增加查询条件
$list = Student::withCount(['roles as role_count'=>function($query) {
$query->where('roles.id', 1);
}])->get();
参考文档:
https://learnku.com/docs/laravel/8.x/eloquent-relationships/9407
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/facetwitter/p/15815769.html
laravel关联查询的更多相关文章
- laravel 关联查询
- 记一次laravel远程关联查询
如图,一个服务(service)对应一个用户(user),一个用户对应多个标签(tag),同时一个tag也可以通过中间表(pivot)对应对个用户. 现在业务需求如下:查service,这些servi ...
- laravel 中with关联查询限定查询字段
学习了下laravel5.6框架,果然很优雅,比如ActiveJieSuan model中作如下关联:(laravel模型关联关系可以查看https://laravelacademy.org/post ...
- Laravel 中查询 where 记录
Laravel 的 Eloquent 使用 Between $query->whereBetween('age',[$from,$to]) 这是生成 And between ... and .. ...
- Laravel关联模型中过滤结果为空的结果集(has和with区别)
首先看代码: $userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){ return $quer ...
- Laravel关联模型中has和with区别
本篇文章给大家带来的内容是关于Laravel关联模型中has和with区别(详细介绍),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 首先看代码: 1 2 3 4 5 6 $user ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- MYSQL基础操作之数据约束与关联查询
一.MYSQL约束 1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值. 默认值的字段允许为空. 对默认值字段也可以插入null. CREATE TABLE STUDENT( I ...
- C#代码中实现两个表(DataTable)的关联查询(JOIN)
之前通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便.近日遇到一种情况,两个表中的数据已经取到代码中,需要在代码中将这两个表关联起来,并得到它们横 ...
- Mybatis关联查询和数据库不一致问题分析与解决
Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...
随机推荐
- Word15 财务部年度报告office真题
1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在 ...
- HTML元素关系与CSS初步了解
元素之间的关系 1.父子关系 父子关系就是在一个双标签内嵌套其他元素,那么嵌套在其中的元素就相当于"子",其外层元素相当于"父". <body> ...
- python发送钉钉消息通用脚本
1.使用shell生成需要发送的内容. 2.调用该脚本发送文本内容python3,其中的文件 /wj/sbjk,需要改成直接需要发送的文件. [root@manager dingding]# more ...
- vue学习 第一天 html 基础
1.web标准的构成: <结构Structure>(对应html文件).<表现Presentation>(对应css文件) 和<行为Behavior>(对应js)三 ...
- 使用JIMO ActionOne HongHu 及其他MR VR眼镜,将真实场景和游戏内场景混合渲染
1. 在VR相机Head内创建一个 Camera 和两个RawImage(Camera 的参数和VRCamera的参数一致, 两个RawImage尺寸一致, 要把VRCamera的相机遮挡住 ) 2. ...
- if语法案例
if语法案例 1. 判断系统剩余内存 1) 脚本正文 2) 执行结果 2.监控web和数据库的方法 1) 端口监控 2) 进程监控 3) 客户端模拟 4) 数据库判断* 3.mysql数据库检测命令演 ...
- windows文件夹被占用的解除办法
1.第一步,按下快捷键组合 ctrl alt del,打开任务管理器窗口,点击上方菜单栏中的性能选项. 2. 第二步,在性能页面下找到打开资源监视器按钮并点击. 3. 第三步,进入资源监视器页面,点击 ...
- go 编程基础学习笔记
dos 命令 2023-01-26 1.切换盘符 只要输入 c: d: e: 等即可 2.显示目录详细内容 dir 3.切换目录 cd 留意 一个点 . 代表当前目录, 两个点.. 代表上一级目录 4 ...
- Log4net使用探究
第一步: 通过Nuget package 搜索Apache Log4net安装 第二步: 在项目Global.asax文件中添加读取 配置文件 第三步: 编写Loghelper 文件 1 public ...
- JavaScript基础知识整理(引用类型-Function)
Function Function类型实际上是对象,每个函数都是Function类型的实例,自然也就具有属性和方法. 定义函数通常有三种方式 使用函数声明 function sum(num1,num2 ...