## 基本查詢
查詢單個數據使用`find`方法:
~~~
// table方法必須指定完整的數據表名
Db::table('think_user')->where('id',1)->find();
~~~
最終生成的SQL語句可能是:
~~~
SELECT * FROM `think_user` WHERE `id` = 1 LIMIT 1
~~~
> find 方法查詢結果不存在,返回 null,否則返回結果數組
如果希望在沒有找到數據后拋出異常可以使用
~~~
// table方法必須指定完整的數據表名
Db::table('think_user')->where('id',1)->findOrFail();
~~~
如果沒有查找到數據,則會拋出一個`think\db\exception\DataNotFoundException`異常。
`V5.1.23+`版本開始,支持`findOrEmpty`方法,當查詢不存在的時候返回空數組而不是Null。
~~~
// table方法必須指定完整的數據表名
Db::table('think_user')->where('id',1)->findOrEmpty();
~~~
查詢多個數據(數據集)使用`select`方法:
~~~
Db::table('think_user')->where('status',1)->select();
~~~
最終生成的SQL語句可能是:
~~~
SELECT * FROM `think_user` WHERE `status` = 1
~~~
> select 方法查詢結果是一個二維數組,如果結果不存在,返回空數組
如果希望在沒有查找到數據后拋出異常可以使用
~~~
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`方法效果一致。
在`find`和`select`方法之前可以使用所有的鏈式操作(參考[鏈式操作](354005)章節)方法。
> 默認情況下,`find`和`select`方法返回的都是數組,區別在于后者是二維數組。
### 助手函數
系統提供了一個`db`助手函數,可以更方便的查詢:
~~~
db('user')->where('id',1)->find();
db('user')->where('status',1)->select();
~~~
`db`方法的第一個參數的作用和`name`方法一樣,如果需要使用不同的數據庫連接,可以使用:
~~~
db('user','db_config1')->where('id', 1)->find();
~~~
## 值和列查詢
查詢某個字段的值可以用
~~~
// 返回某個字段的值
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) {
//
}
});
// 或者交給回調方法myUserIterator處理
Db::table('think_user')->chunk(100, 'myUserIterator');
~~~
你可以通過從閉包函數中返回`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的生成器特性,可以大幅減少大量數據查詢的內存占用問題。
~~~
$cursor = Db::table('user')->where('status', 1)->cursor();
foreach($cursor as $user){
echo $user['name'];
}
~~~
`cursor`方法返回的是一個生成器對象,`user`變量是數據表的一條數據(數組)。
## JSON類型數據查詢(`mysql`)
~~~
// 查詢JSON類型字段 (info字段為json類型)
Db::table('think_user')
->where('info->email','thinkphp@qq.com')
->find();
~~~
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 架構總覽
- 入口文件
- URL訪問
- 模塊設計
- 命名空間
- 容器和依賴注入
- Facade
- 鉤子和行為
- 中間件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 閉包支持
- 路由參數
- 路由緩存
- 跨域請求
- 注解路由
- 路由分組
- MISS路由
- 資源路由
- 快捷路由
- 路由別名
- 路由綁定
- 域名路由
- URL生成
- 控制器
- 控制器定義
- 前置操作
- 跳轉和重定向
- 空操作和空控制器
- 分層控制器
- 資源控制器
- 控制器中間件
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 數據庫
- 連接數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- 聚合查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 查詢事件
- 獲取器
- 事務操作
- 監聽SQL
- 存儲過程
- 數據集
- 分布式數據庫
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- JSON字段
- 獲取器
- 修改器
- 搜索器
- 數據集
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 數據完成
- 查詢范圍
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 視圖
- 視圖渲染
- 視圖賦值
- 視圖過濾
- 模板引擎
- 模板
- 變量輸出
- 使用函數
- 運算符
- 原樣輸出
- 模板注釋
- 模板布局
- 模板繼承
- 包含文件
- 輸出替換
- 標簽庫
- 內置標簽
- 循環標簽
- 比較標簽
- 條件判斷
- 資源文件加載
- 標簽嵌套
- 原生PHP
- 定義標簽
- 標簽擴展
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- 性能調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 獨立驗證
- 靜態調用
- 表單令牌
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 分頁
- 上傳
- 命令行
- 啟動內置服務器
- 查看版本
- 自動生成目錄結構
- 創建類庫文件
- 生成類庫映射文件
- 清除緩存文件
- 生成配置緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 輸出路由定義
- 自定義指令
- 擴展庫
- 驗證碼
- 圖像處理
- Time
- 數據庫遷移工具
- Swoole
- Workerman
- MongoDb
- 單元測試
- 安全和性能
- 安全建議
- 優化建議
- 附錄
- 助手函數
- 升級指導
- 更新日志