ThinkPHP5数据库实例详解 /混合查询(闭包实现)

混合查询(闭包实现)

where 和 whereOr 联合查询

1、实现多条件复合查询

这类查询开发经常用到:先获取到部分满足条件记录,再筛选出想要的结果

2、实现手段:

因涉及到复杂查询条件的生成,这非常适合闭包(匿名函数)来实现

3、实例演示:

任务:查询dept=1或者sex=1的员工中,id 在1010到1020之间的员工信息

分析:这是在上节课whereOr实例基础上,再增加一个AND条件

1.可能有学员会问,我们用where或whereOr连续调用行吗?理论上似乎存在这种可能,实际上不能实现的,因为多个逻辑条件罗列在一起时,where或whereOr处理起来并不区别主次,全部依次执行,达不到我们要的效果。

  • 我们修改一下Index.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:

SELECTid,name,deptFROMtp5_staffWHERE ( 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: ~~~  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语句:

    现在是正确的啦,刚才生成的SQL语句是不对的

SELECT `id`,`name`,`dept` FROM `tp5_staff` WHERE ( ( dept = 1 ) OR ( sex = 1 ) ) AND ( id between 1010 and 1020 );
  • 将该语句放在SQLPRO 中执行:

4、总结:

复杂条件查询,用闭包方式,将多个条件打包是不错的方法,一定要熟练掌握