[TOC] ## where 和 whereOr 联合查询 ### 1、实现多条件复合查询 >[info] 这类查询开发经常用到:先获取到部分满足条件记录,再筛选出想要的结果 ### 2、实现手段: >[info] 因涉及到复杂查询条件的生成,这非常适合闭包(匿名函数)来实现 ### 3、实例演示: #### 任务:查询dept=1或者sex=1的员工中,id 在1010到1020之间的员工信息 >[info] 分析:这是在上节课whereOr实例基础上,再增加一个AND条件 1.可能有学员会问,我们用where或whereOr连续调用行吗?理论上似乎存在这种可能,实际上不能实现的,因为多个逻辑条件罗列在一起时,where或whereOr处理起来并不区别主次,全部依次执行,达不到我们要的效果。 * 我们修改一下Index.php: ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index(){ //查询 dept(部门)等于 1 的员工信息 $result = Db::table('tp5_staff') // 设置数据表 -> field('id,name,dept') // 设置结果集中允许显示的字段 -> where('dept = 1') // 设置查询条件dept =1 -> whereOr('sex = 1') // 设置查询条件 sex = 1 逻辑OR关系 -> where('id between 1010 and 1020') //设置id > 1010 and id < 1020之间 -> select(); // 获取结果集 //查看结果 dump($result); } } ~~~ * 生成的SQL: ~~~ SELECT `id`,`name`,`dept` FROM `tp5_staff` WHERE ( dept = 1 ) AND ( id between 1010 and 1020 ) OR ( sex = 1 ) ~~~ * 运行结果: ![](https://box.kancloud.cn/5bde9e39fc5164db5c89a0d7cf9715e8_962x775.png) >[danger] 显然这个结果不是我想要的结果 >因此,二个以上的查询条件、并且逻辑关系包括了AND和OR时,不用连接调用where或whereOr来实现。要用闭包(匿名函数)来做! #### 用闭包实现混合条件查询,完成上面的实例: >[success] 思路:上面语句的错误在于前二个where和whereOr方法生成的查询条件,没有打包在一组中,我们用闭包来实现,最后一个where('id between 1010 and 1020')是不需要改造的。 * 用闭包再次修改一下Index.php: ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index(){ //查询 dept(部门)等于 1 的员工信息 $result = Db::table('tp5_staff') // 设置数据表 -> field('id,name,dept') // 设置结果集中允许显示的字段 -> where(function($query){ $query -> where('dept = 1') -> whereOr('sex = 1') ; }) -> where('id between 1010 and 1020') //设置id > 1010 and id < 1020之间 -> select(); // 获取结果集 //查看结果 dump($result); } } ~~~ * 查看结果: ~~~ array(3) { [0] => array(3) { ["id"] => int(1010) ["name"] => string(9) "欧阳峰" ["dept"] => int(2) } [1] => array(3) { ["id"] => int(1011) ["name"] => string(9) "李云龙" ["dept"] => int(1) } [2] => array(3) { ["id"] => int(1012) ["name"] => string(9) "楚云飞" ["dept"] => int(3) } } ~~~ * 生成的SQL语句: >[warning] 现在是正确的啦,刚才生成的SQL语句是不对的 ~~~ SELECT `id`,`name`,`dept` FROM `tp5_staff` WHERE ( ( dept = 1 ) OR ( sex = 1 ) ) AND ( id between 1010 and 1020 ); ~~~ * 将该语句放在SQLPRO 中执行: ![](https://box.kancloud.cn/164f79196669e672afdce59a7de22eaf_835x306.png) ### 4、总结: #### 复杂条件查询,用闭包方式,将多个条件打包是不错的方法,一定要熟练掌握