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
,dept
FROMtp5_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: ~~~ 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 中执行: