[http://www.hmoore.net/manual/thinkphp6\_0/1037538](http://www.hmoore.net/manual/thinkphp6_0/1037538)
[TOC]
# where
表達式查詢是官方推薦使用的查詢方式
~~~
//注意使用字符串查詢條件(不推薦) :SELECT * FROM think_user WHERE type=1 AND status=1
Db::table('think_user')->whereRaw('type=1 AND status=1')->select();
//字符串查詢條件預處理
Db::table('think_user')
->whereRaw("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp'])
->select();
//SELECT * FROM think_user WHERE `name`='thinkphp' AND id > 1
Db::table('think_user')
->where('id','>',1)
->where('name','thinkphp')
->select();
//關聯數組(主要用于等值`AND`條件)等值 and條件 傳入數組作為查詢條件:
//SELECT * FROM think_user WHERE `name`='thinkphp' AND status = 1
Db::table('think_user')->where([
'name' => 'thinkphp',
'status'=> 1
])->select();
//索引數組條件查詢(推薦)
// 傳入關聯數組作為查詢條件
//SELECT * FROM think_user WHERE `name`='thinkphp' AND status = 1
Db::table('think_user')->where([
['name','=','thinkphp'],
['status','=',1]
])->select();
$where=[
['inmonth','between',[1631808000,1633967999]
['company_id','=','1']
];
Db::table('think_user')->where($where)->select();
//索引數組的組裝
$map[] = ['name','like','think'];
$map[] = ['status','=',1];
Db::table('think_user')->where($map)->select();
//數組條件
$map['name'] = 'thinkphp';//普通查詢
$map['status'] = 1;//普通查詢
$map['id'] = ['>',1];//使用查詢表達式
$map['mail'] = ['like','%thinkphp@qq.com%'];//使用查詢表達式
Db::table('think_user')->where($map)->select();
~~~
# table
指定操作的數據表。
```
//table方法指定的數據表需要完整的表名
Db::table('think_user')->where('status>1')->select();
//可以指定數據庫
Db::table('think_user')->where('status>1')->select();
//name方式簡化數據表前綴的傳入(前綴可省略)
Db::name('user')->where('status>1')->select();
```
# alias
用于設置當前數據表的別名,便于使用其他的連貫操作例如join方法等
~~~
//SELECT * FROM think_user a INNER JOIN think_dept b ON b.user_id= a.id
Db::table('think_user')
->alias('a')
->join('think_dept b ','b.user_id= a.id')
->select();
//SELECT * FROM think_user user INNER JOIN think_dept dept ON dept.user_id= user.id
Db::table('think_user')
->alias(['think_user'=>'user','think_dept'=>'dept'])
->join('think_dept','dept.user_id= user.id')
->select();
~~~
# field
標識要返回或者操作的字段,可以用于查詢和寫入操作
~~~
//SELECT id,nickname as name FROM user
Db::table('user')->field('id,nickname as name')->select();
//SELECT id,nickname as name FROM user
Db::table('user')->field(['id','nickname'=>'name'])->select();
~~~
# strict
設置是否嚴格檢查字段名
~~~
// 關閉字段嚴格檢查
Db::name('user')
->strict(false)
->insert($data);
~~~
>[danger]系統默認值是由數據庫配置參數`fields_strict`決定;
設置關閉全局的嚴格檢查配置`'fields_strict' => false,`
# limit
指定查詢和操作的數量。
~~~
Db::table('article')->limit(10)->select();
Db::table('article')->limit(10,25)->select();
~~~
# page
用于分頁查詢。
~~~
// 查詢第一頁數據
Db::table('article')->page(1,10)->select();
// 查詢第二頁數據
Db::table('article')->page(2,10)->select();
//`page`方法還可以和`limit`方法配合使用,例如:
Db::table('article')->limit(25)->page(3)->select();
//等同
Db::table('article')->page(3,25)->select();
~~~
# order
對操作的結果排序或者優先級限制。
~~~
Db::table('user')
->where('status', 1)
->order('id', 'desc')
->limit(5)
->select();
//支持使用數組對多個字段的排序
Db::table('user')
->where('status', 1)
->order(['order','id'=>'desc'])
->limit(5)
->select();
~~~
# group
用于結合合計函數,根據一個或多個列對結果集進行分組
~~~
//我們都查詢結果按照用戶id進行分組統計:ELECT user_id,username,max(score) FROM score GROUP BY user_id
Db::table('user')
->field('user_id,username,max(score)')
->group('user_id')
->select();
//也支持對多個字段進行分組:SELECT user_id,test_time,username,max(score) FROM user GROUP BY user_id,test_time
Db::table('user')
->field('user_id,test_time,username,max(score)')
->group('user_id,test_time')
->select();
~~~
# having
用于配合group方法完成從分組的結果中篩選(通常是聚合條件)數據
~~~
//SELECT username,max(score) FROM score GROUP BY user_id HAVING count(test_time)>3
Db::table('score')
->field('username,max(score)')
->group('user_id')
->having('count(test_time)>3')
->select();
~~~
# join
~~~
join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] ) 等同于 JOIN(默認的JOIN類型),如果表中有至少一個匹配,則返回行
leftJoin ( mixed join [, mixed $condition = null ] ) 即使右表中沒有匹配,也從左表返回所有的行
rightJoin ( mixed join [, mixed $condition = null ] ) 即使左表中沒有匹配,也從右表返回所有的行
fullJoin ( mixed join [, mixed $condition = null ] ) 只要其中一個表中存在匹配,就返回行
~~~
~~~
Db::table('think_user')
->alias('a')
->join(['think_work'=>'w'],'a.id=w.artist_id')
->join(['think_card'=>'c'],'a.card_id=c.id')
->select();
~~~
# union
用于合并兩個或多個 SELECT 語句的結果集。
~~~
Db::field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1')
->union('SELECT name FROM think_user_2')
->select();
~~~
支持UNION ALL 操作,例如:
~~~
Db::field('name')
->table('think_user_0')
->unionAll('SELECT name FROM think_user_1')
->unionAll('SELECT name FROM think_user_2')
->select();
~~~
# distinct
用于返回唯一不同的值 。
~~~
//回`user_login`字段不同的數據 SELECT DISTINCT user_login FROM think_user
Db::table('think_user')->distinct(true)->field('user_login')->select();
~~~
# lock
用于數據庫的鎖機制,如果在查詢或者執行操作的時候使用
`Lock`方法是用于數據庫的鎖機制,如果在查詢或者執行操作的時候使用:
~~~
Db::name('user')->where('id',1)->lock(true)->find();
~~~
就會自動在生成的SQL語句最后加上`FOR UPDATE` (Oracle數據庫:`FOR UPDATE NOWAIT`)。加上FOR UPDATE后這條數據就會被鎖定,保證了此條數據不會被其他語句修改
lock方法支持傳入字符串用于一些特殊的鎖定要求,例如:
~~~
Db::name('user')->where('id',1)->lock('lock in share mode')->find();
~~~
# cache
`cache`方法用于查詢緩存操作,也是連貫操作方法之一。
**cache**可以用于`select`、`find`、`value`和`column`方法,以及其衍生方法,使用`cache`方法后,在緩存有效期之內不會再次進行數據庫查詢操作,而是直接獲取緩存中的數據,關于數據緩存的類型和設置可以參考緩存部分。
對find方法使用cache方法如下:
~~~
Db::table('user')->where('id',5)->cache(true)->find();
~~~
第一次查詢結果會被緩存,第二次查詢相同的數據的時候就會直接返回緩存中的內容,而不需要再次進行數據庫查詢操作。
默認情況下, 緩存有效期是由默認的緩存配置參數決定的,但`cache`方法可以單獨指定,例如下面:表示對查詢結果的緩存有效期60秒。
~~~
Db::table('user')->cache(true,60)->find();
// 或者使用下面的方式 是等效的
Db::table('user')->cache(60)->find();
~~~
cache方法可以指定緩存標識:
~~~
Db::table('user')->cache('key',60)->find();
~~~
>[danger] 指定查詢緩存的標識可以使得查詢緩存更有效率。
這樣,在外部就可以通過`\think\Cache`類直接獲取查詢緩存的數據,例如:
~~~
$result = Db::table('user')->cache('key',60)->find();
$data = \think\facade\Cache::get('key');
~~~
`cache`方法支持設置緩存標簽,例如:
~~~
Db::table('user')->cache('key',60,'tagName')->find();
~~~
### **緩存自動更新**
這里的緩存自動更新是指一旦數據更新或者刪除后會自動清理緩存(下次獲取的時候會自動重新緩存)。
當你刪除或者更新數據的時候,可以調用相同`key`的`cache`方法,會自動更新(清除)緩存,例如:
~~~
Db::table('user')->cache('user_data')->select([1,3,5]);
Db::table('user')->cache('user_data')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('user')->cache('user_data')->select([1,3,5]);
~~~
最后查詢的數據不會受第一條查詢緩存的影響,確保查詢和更新或者刪除使用相同的緩存標識才能自動清除緩存。
如果使用主鍵進行查詢和更新(或者刪除)的話,無需指定緩存標識會自動更新緩存
~~~
Db::table('user')->cache(true)->find(1);
Db::table('user')->cache(true)->where('id', 1)->update(['name'=>'thinkphp']);
Db::table('user')->cache(true)->find(1);
~~~
# comment
用于在生成的SQL語句中添加注釋內容
~~~
//SELECT username,score FROM think_score ORDER BY score desc LIMIT 10 /* 查詢考試前十名分數 */
Db::table('think_score')->comment('查詢考試前十名分數')
->field('username,score')
->limit(10)
->order('score desc')
->select();
~~~
# fetchSql
用于直接返回SQL而不是執行查詢,適用于任何的CURD操作方法
~~~
echo Db::table('user')->fetchSql(true)->find(1);
//輸出;SELECT * FROM user where `id` = 1
~~~
# force
用于數據集的強制索引操作,例如:
~~~
Db::table('user')->force('user1')->select();
~~~
>[danger]對查詢強制使用`user1`索引,`user1`必須是數據表實際創建的索引名稱
# partition
用于`MySQL`數據庫的分區查詢,用法如下:
~~~
// 用于查詢
Db::name('log')
->partition(['p1','p2'])
->select();
// 用于寫入
Db::name('user')
->partition('p1')
->insert(['name' => 'think', 'score' => 100']);
~~~
# failException
設置查詢數據為空時是否需要拋出異常,用于`select`和`find`方法,例如:
~~~
// 數據不存在的話直接拋出異常
Db::name('blog')
->where('status',1)
->failException()
->select();
// 數據不存在返回空數組 不拋異常
Db::name('blog')
->where('status',1)
->failException(false)
->select();
~~~
或者可以使用更方便的查空報錯
~~~
// 查詢多條
Db::name('blog')
->where('status', 1)
->selectOrFail();
// 查詢單條
Db::name('blog')
->where('status', 1)
->findOrFail();
~~~
# sequence
用于`pgsql`數據庫指定自增序列名,其它數據庫不必使用,用法為:
~~~
Db::name('user')
->sequence('user_id_seq')
->insert(['name'=>'thinkphp']);
~~~
# replace
`replace`方法用于設置`MySQL`數據庫`insert`方法或者`insertAll`方法寫入數據的時候是否適用`REPLACE`方式
即**他是用來判斷添加的這條語句 根據主鍵判斷是否存在。**
主鍵存在**則替換**:
主鍵不存在**則新增**:
~~~
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
//此處主鍵不存在著新增
Db::name('user')->replace()->insertAll($data);
~~~
# extra
用于`CURD`查詢,例如:
~~~
Db::name('user')
->extra('IGNORE')
->insert(['name' => 'think']);
Db::name('user')
->extra('DELAYED')
->insert(['name' => 'think']);
Db::name('user')
->extra('SQL_BUFFER_RESULT')
->select();
~~~
# duplicate
用于設置`DUPLICATE`查詢,用法示例:
~~~
Db::name('user')
->duplicate(['score' => 10])
->insert(['name' => 'think']);
~~~
# procedure
用于設置當前查詢是否為存儲過程查詢,用法如下:
~~~
$resultSet = Db::procedure(true)
->query('call procedure_name');
~~~
- 空白目錄
- php語法結構
- 安裝與更新
- 開啟調試模式及代碼跟蹤器
- 架構
- 源碼分析
- 應用初始化
- 請求流程
- 中間件源碼分析
- 請求處理源碼分析
- Request源碼分析
- 模板編譯流程
- 路由與請求流程
- 容器
- 獲取目錄位置
- 入口文件
- 多應用模式及URL訪問
- 依賴注入與容器
- 容器屬性及方法
- Container
- App
- facade
- 中間件(middleware)
- 系統服務
- extend 擴展類庫
- 筆記
- 配置
- env配置定義及獲取
- 配置文件的配置獲取
- 單應用模式-(配置)文件目錄結構(默認)
- 多應用模式(配置)文件目錄結構(配置文件)
- 配置文件
- 應用配置:app.php
- 緩存配置: cache.php
- 數據庫配置:database.php
- 路由和URL配置:route.php
- Cookie配置:cookie.php
- Session配置:session.php
- 命令行配置:console.php
- 多語言配置:lang.php
- 日志配置:log.php
- 頁面Trace配置:trace.php
- 磁盤配置: filesystem.php
- 中間件配置:middleware.php
- 視圖配置:view.php
- 改成用yaconf配置
- 事件
- 例子:省略事件類的demo
- 例子2:完整事件類
- 例子3:事件訂閱,監聽多個事件
- 解析
- 路由
- 路由定義
- 路由地址
- 變量規則
- MISS路由
- URL生成
- 閉包支持
- 路由參數
- 路由中間件
- 路由分組
- 資源路由
- 注解路由
- 路由綁定
- 域名路由
- 路由緩存
- 跨域路由
- 控制器
- 控制器定義
- 空控制器、空操作
- 空模塊處理
- RESTFul資源控制器
- 控制器中間件
- 請求對象Request(url參數)
- 請求信息
- 獲取輸入變量($_POST、$_GET等)
- 請求類型的獲取與偽裝
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應對象Response
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 錯誤頁面的處理辦法
- 應用公共文件common.php
- 模型
- 模型定義及常規屬性
- 模型數據獲取與模型賦值
- 查詢
- 數據集
- 增加
- 修改
- 刪除
- 條件
- 查詢范圍scope
- 獲取器
- 修改器
- 搜索器
- 軟刪除
- 模型事件
- 關聯預載入
- 模型關聯
- 一對一關聯
- 一對多關聯
- 多對多關聯
- 自動時間戳
- 事務
- 數據庫
- 查詢構造器
- 查詢合集
- 子查詢
- 聚合查詢
- 時間查詢
- 視圖查詢(比join簡單)
- 獲取查詢參數
- 快捷方法
- 動態查詢
- 條件查詢
- 打印sql語句
- 增
- 刪
- 改
- 查
- 鏈式操作
- 查詢表達式
- 分頁查詢
- 原生查詢
- JSON字段
- 鏈接數據庫配置
- 分布式數據庫
- 查詢事件
- Db獲取器
- 事務操作
- 存儲過程
- Db數據集
- 數據庫驅動
- 視圖
- 模板
- 模板配置
- 模板位置
- 模板渲染
- 模板變量與賦值(assign)
- 模板輸出替換
- url生成
- 模板詳解
- 內置標簽
- 三元運算
- 變量輸出
- 函數輸出
- Request請求參數
- 模板注釋及原樣輸出
- 模板繼承
- 模板布局
- 原生PHP
- 模板引擎
- 視圖過濾
- 視圖驅動
- 驗證
- 驗證進階之最終版
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 遠程調試
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 上傳
- 擴展說明
- N+1查詢
- TP類庫
- 擴展類庫
- 數據庫遷移工具
- Workerman
- think助手工具庫
- 驗證碼
- Swoole
- request
- app
- Response
- View
- Validate
- Config
- 命令行
- 助手函數
- 升級指導(功能的添加與刪除說明)
- siyucms
- 開始
- 添加頁面流程
- 列表頁加載流程
- 彈出框
- 基礎控制器
- 基礎模型
- 快速構建
- 表單form構建
- 表格table構建
- MakeBuilder
- 前端組件
- 日期組件
- layer 彈層組件
- Moment.js 日期處理插件
- siyucms模板布局
- 函數即其變量
- 前端頁面
- $.operate.方法
- $.modal.方法:彈出層
- $.common.方法:通用方法
- 被cms重寫的表格options
- 自定義模板
- 搜索框
- 自定義form表單
- 獲取表單搜索參數并組裝為url字符串