[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、总结:
#### 复杂条件查询,用闭包方式,将多个条件打包是不错的方法,一定要熟练掌握
- 前言[随时更新]
- ThinkPHP 5数据库重构
- 开发环境
- 1.ThinkPHP5开发环境(Mac版)
- 2.ThinkPHP5开发环境(Win版)
- MySQL快速复习
- 1.数据库操作
- 2.数据表操作
- 1.创建数据表 (重点)
- 2.添加数据表记录
- 3.查询数据表(重点)
- 4.更新数据表
- 5.编辑数据表结构(重点)
- 6_复制数据表
- 7.删除数据和表
- 连接数据库
- 1.数据库配置文件database.php
- 2.Db类静态方法connect()
- 3.模块中的配置文件config.php
- MySQL原生查询
- 1.读操作query
- 2.写操作execute
- 选择数据表
- 1.table与setTable方法
- 2.name方法
- 3.db助手函数
- 4.alias方法
- 结果集查询
- 1.find方法
- 2.select方法
- 3.fetchSql方法
- 4.value方法
- 5.column方法
- 6.field方法
- 新增数据
- 1.insert_单条添加
- 2.insertAll_批量添加
- 3_db_助手函数添加
- 更新数据
- 1.update方法
- 2.setField更新字段
- 3_自增自减与延时更新
- 删除数据
- 1.delete方法
- 查询方法
- 1.getTableInfo方法
- 2.where方法
- 3.whereOr方法
- 4.混合查询(闭包实现)
- 表达式查询
- 1.表达式查询(重点)
- 2.exp通用查询
- 分组查询
- 1.group方法
- 2.having方法
- 排序分页查询
- 1.order方法
- 2.limit方法
- 3.page方法
- 聚合查询
- 时间查询
- 1.where方法
- 2.whereTime方法
- 高级查询
- 1.快捷查询
- 2.区间查询
- 3.批量查询
- 4.Query对象查询
- 5.混合查询
- 视图查询
- view方法
- 子查询
- 1.select方法
- 2.fetchSql方法
- 3.buildSql方法
- 4.闭包子查询
- 总结/参考
- 1.方法参数类型总结
- 2.查询/子查询/连接查询