本篇給出了基本的查詢用法,更多的查詢用法可以參考后續的章節。
## 查詢單個數據
查詢單個數據使用`find`方法:
~~~
// table方法必須指定完整的數據表名
Db::table('think_user')->where('id', 1)->find();
// 如果設置了數據表前綴(prefix)參數的話 也可以使用
Db::name('user')->where('id', 1)->find();
~~~
>[danger] 即使滿足條件的數據有多個,`find`查詢也只會返回一條數據。你可以使用`order`排序來決定返回某一條數據。
最終生成的SQL語句可能是(本手冊中的示例如未說明均以MySql作為示例):
~~~
SELECT * FROM `think_user` WHERE `id` = 1 LIMIT 1
~~~
> `find `方法查詢結果不存在,返回 `null`,否則返回結果數組
如果希望查詢數據不存在的時候返回空數組,可以使用
~~~
// table方法必須指定完整的數據表名
Db::table('think_user')->where('id', 1)->findOrEmpty();
~~~
如果希望在沒有找到數據后拋出異常可以使用
~~~
Db::table('think_user')->where('id', 1)->findOrFail();
~~~
如果沒有查找到數據,則會拋出一個 think\db\exception\DataNotFoundException 異常。
## 查詢數據集
查詢多個數據(數據集)使用`select`方法:
~~~
$list = Db::table('think_user')->where('status', 1)->select();
foreach ($list as $user) {
echo $user['name'];
}
~~~
最終生成的SQL語句可能是:
~~~
SELECT * FROM `think_user` WHERE `status` = 1
~~~
`select` 方法查詢結果是一個數據集對象(`think\Collection`),如果需要轉換為(二維)數組可以使用
~~~
$list = Db::table('think_user')->where('status', 1)->select()->toArray();
foreach ($list as $user) {
echo $user['name'];
}
~~~
但通常這是沒有必要的,因為數據集對象的操作和數組是幾乎一致的。
如果希望在沒有查找到數據后拋出異常可以使用
~~~
Db::table('think_user')->where('status',1)->selectOrFail();
~~~
如果沒有查找到數據,同樣也會拋出一個 think\db\exception\DataNotFoundException 異常。
如果設置了數據表前綴參數的話,可以使用
~~~
Db::name('user')->where('id', 1)->find();
Db::name('user')->where('status', 1)->select();
~~~
>[info] 如果你的數據表沒有設置表前綴的話,那么`name`和`table`方法效果一致。
示例只是使用了簡單的`where`方法,其實在`find`和`select`方法之前可以使用更多的鏈式操作(參考后面[鏈式操作](%E9%93%BE%E5%BC%8F%E6%93%8D%E4%BD%9C.md)章節)方法以完成更多的查詢條件。
## 數據集
數據庫的`select`查詢結果默認返回數據集對象(`think\Collection`),提供了和數組無差別用法,并且另外封裝了一些額外的方法。
~~~
// 獲取數據集
$users = Db::name('user')->select();
// 遍歷數據集
foreach($users as $user){
echo $user['name'];
echo $user['id'];
}
~~~
可以直接使用數組的方式操作數據集對象,例如:
~~~
// 獲取數據集
$users = Db::name('user')->select();
// 直接操作第一個元素
$item = $users[0];
// 獲取數據集記錄數
$count = count($users);
// 遍歷數據集
foreach($users as $user){
echo $user['name'];
echo $user['id'];
}
~~~
需要注意的是,如果要判斷數據集是否為空,不能直接使用`empty`判斷,而必須使用數據集對象的`isEmpty`方法判斷,例如:
~~~
$users = Db::name('user')->select();
if($users->isEmpty()){
echo '數據集為空';
}
~~~
`think\Collection`類包含了下列主要方法:
|方法|描述|
|---|---|
|isEmpty|是否為空|
|toArray|轉換為數組|
|all|所有數據|
|merge|合并其它數據|
|diff|比較數組,返回差集|
|flip|交換數據中的鍵和值|
|intersect|比較數組,返回交集|
|keys|返回數據中的所有鍵名|
|first|返回第一個元素|
|last|返回最后一個元素|
|pop|刪除數據中的最后一個元素|
|shift|刪除數據中的第一個元素|
|unshift|在數據開頭插入一個元素|
|push|在結尾插入一個元素|
|reduce|通過使用用戶自定義函數,以字符串返回數組|
|reverse|數據倒序重排|
|chunk|數據分隔為多個數據塊|
|each|給數據的每個元素執行回調|
|filter|用回調函數過濾數據中的元素|
|column|返回數據中的指定列|
|sort|對數據排序|
|order|指定字段排序|
|shuffle|將數據打亂|
|slice|截取數據中的一部分|
|map|用回調函數處理數組中的元素|
|where|根據字段條件過濾數組中的元素|
|whereLike|Like查詢過濾元素|
|whereNotLike|Not Like過濾元素|
|whereIn|IN查詢過濾數組中的元素|
|whereNotIn|Not IN查詢過濾數組中的元素|
|whereBetween|Between查詢過濾數組中的元素|
|whereNotBetween|Not Between查詢過濾數組中的元素|
## 值和列查詢
查詢某個字段的值可以用
~~~
// 返回某個字段的值
Db::table('think_user')->where('id', 1)->value('name');
~~~
> `value`方法查詢結果不存在,返回 null
查詢某一列的值可以用
~~~
// 返回數組
Db::table('think_user')->where('status',1)->column('name');
// 指定id字段的值作為索引
Db::table('think_user')->where('status',1)->column('name', 'id');
~~~
如果要返回完整數據,并且添加一個索引值的話,可以使用
~~~
// 指定id字段的值作為索引 返回所有數據
Db::table('think_user')->where('status',1)->column('*','id');
~~~
> `column `方法查詢結果不存在,返回空數組
## 數據分批處理
如果你需要處理成千上百條數據庫記錄,可以考慮使用`chunk`方法,該方法一次獲取結果集的一小塊,然后填充每一小塊數據到要處理的閉包,該方法在編寫處理大量數據庫記錄的時候非常有用。
比如,我們可以全部用戶表數據進行分批處理,每次處理 100 個用戶記錄:
~~~
Db::table('think_user')->chunk(100, function($users) {
foreach ($users as $user) {
// 對100條用戶數據進行處理操作
}
});
~~~
你可以通過從閉包函數中返回`false`來中止對后續數據集的處理:
~~~
Db::table('think_user')->chunk(100, function($users) {
foreach ($users as $user) {
// 處理結果集...
if($user->status == 0){
return false;
}
}
});
~~~
也支持在`chunk`方法之前調用其它的查詢方法,例如:
~~~
Db::table('think_user')
->where('score','>',80)
->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});
~~~
`chunk`方法的處理默認是根據主鍵查詢,支持指定字段,例如:
~~~
Db::table('think_user')->chunk(100, function($users) {
// 處理結果集...
return false;
},'create_time');
~~~
并且支持指定處理數據的順序。
~~~
Db::table('think_user')->chunk(100, function($users) {
// 處理結果集...
return false;
},'create_time', 'desc');
~~~
>[danger] `chunk`方法一般用于命令行操作批處理數據庫的數據,不適合WEB訪問處理大量數據,很容易導致超時。
## 游標查詢
如果你需要處理大量的數據,可以使用游標查詢功能,該查詢方式利用了PHP的生成器特性,可以大幅減少大量數據查詢的內存開銷問題。
~~~
$list = Db::name('user')->where('status', 1)->cursor();
foreach($list as $user){
echo $user['name'];
}
~~~
`cursor`方法返回的是一個生成器對象,`user`變量是數據表的一條數據(數組)。
- 簡介
- 數據庫配置
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 新增數據
- 更新數據
- 刪除數據
- 鏈式操作
- Where
- Table
- Alias
- Field
- Strict
- Limit
- Page
- Order
- Group
- Having
- Join
- Union
- Distinct
- Lock
- Cache
- Comment
- FetchSql
- Force
- Partition
- Replace
- FailException
- Extra
- Duplicate
- Sequence
- Procedure
- View
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 子查詢
- 原生查詢
- 事務操作
- 存儲過程
- 查詢事件
- JSON字段
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- 只讀字段
- JSON字段
- 自動時間寫入
- 獲取器
- 修改器
- 搜索器
- 類型轉換
- 模型輸出
- 模型事件
- 虛擬模型
- 關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態一對多
- 多態一對一
- 關聯預載入
- 關聯統計
- 關聯輸出
- SQL監聽
- 緩存機制
- 字段緩存
- 查詢緩存
- 擴展
- 自定義查詢類
- 自定義數據庫驅動