whereExists
基础概念
子查询的一种,查询出前面的结果(外部查询)之后,然后将前面的结果查出来的集和后者(内部查询)进行再次查询比较,如果后者中存在那么就可存在
经典格式
select * from table1 where exists(select * from where table1.id=table2.table_id)
---------外部查询----------------- ---------------内部查询-----------------------
代码分析
使用场景
使用查询出来所有含有学生的班级,没有学生的班级不进行查询
数据表
班级表(student_class)
- id
- name
学生表(student)
- id
- name
- age
- student_id
代码实例
// 写法一
$result = DB::table('student_class')
->select('id','name')
->whereExists(function ($query) {
return $query
->selectRaw(1)
->from('student')
->whereColumn('student_class.id','student.class_id');
})
->get();
// 写法二
$result = DB::table('student_class')
->select('id','name')
->whereExists(function ($query) {
return $query
->selectRaw(1)
->from('student' )
->whereRaw('student_class.id=student.class_id');
})
->get();
执行的sql分析
select `id`, `name` from `student_class` where exists ( select 1 from `student` where `student_class`.`id` = `student`.`class_id` )
后话
-
whereExist
使用时候,传入的参数为闭包函数中,闭包函数中使用DB::table(table)
这种方式无效,只可以使用$query->from(table)
这种方式。