[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 )
~~~
* 運行結果:

>[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 中執行:

### 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.查詢/子查詢/連接查詢