模型查詢和數據庫查詢方法的區別主要在于,模型中的查詢的數據在獲取的時候會經過獲取器的處理,以及更加對象化的獲取方式。
>[danger] 模型查詢除了使用自身的查詢方法外,一樣可以使用數據庫的查詢構造器,返回的都是模型對象實例。但如果直接調用查詢對象的方法,IDE可能無法完成自動提示。
## 獲取單個數據
獲取單個數據的方法包括:
~~~
// 取出主鍵為1的數據
$user = User::find(1);
echo $user->name;
// 使用查詢構造器查詢滿足條件的數據
$user = User::where('name', 'thinkphp')->find();
echo $user->name;
~~~
模型使用`find`方法查詢,如果數據不存在返回`Null`,否則返回當前模型的對象實例。如果希望查詢數據不存在則返回一個空模型,可以使用。
```
$user = User::findOrEmpty(1);
```
你可以用`isEmpty`方法來判斷當前是否為一個空模型。
```
$user = User::where('name', 'thinkphp')->findOrEmpty();
if (!$user->isEmpty()) {
echo $user->name;
}
```
>[danger] 如果你是在模型內部獲取數據,請不要使用`$this->name`的方式來獲取數據,請使用`$this->getAttr('name')` 替代。
## 獲取多個數據
取出多個數據:
~~~
// 根據主鍵獲取多個數據
$list = User::select([1,2,3]);
// 對數據集進行遍歷操作
foreach($list as $key=>$user){
echo $user->name;
}
~~~
要更多的查詢支持,一樣可以使用查詢構造器:
~~~
// 使用查詢構造器查詢
$list = User::where('status', 1)->limit(3)->order('id', 'asc')->select();
foreach($list as $key=>$user){
echo $user->name;
}
~~~
>查詢構造器方式的查詢可以支持更多的連貫操作,包括排序、數量限制等。
### 自定義數據集對象
模型的`select`方法返回的是一個包含多個模型實例的數據集對象(默認為`\think\model\Collection`),支持在模型中單獨設置查詢數據集的返回對象的名稱,例如:
~~~
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
// 設置返回數據集的對象名
protected $resultSetType = '\app\common\Collection';
}
~~~
`resultSetType`屬性用于設置自定義的數據集使用的類名,該類應當繼承系統的`think\model\Collection`類。
## 使用查詢構造器
在模型中仍然可以調用數據庫的鏈式操作和查詢方法,可以充分利用數據庫的查詢構造器的優勢。
例如:
~~~php
User::where('id',10)->find();
User::where('status',1)->order('id desc')->select();
User::where('status',1)->limit(10)->select();
~~~
使用查詢構造器直接使用靜態方法調用即可,無需先實例化模型。
### 獲取某個字段或者某個列的值
~~~php
// 獲取某個用戶的積分
User::where('id',10)->value('score');
// 獲取某個列的所有值
User::where('status',1)->column('name');
// 以id為索引
User::where('status',1)->column('name','id');
~~~
>[danger] `value`和`column`方法返回的不再是一個模型對象實例,而是純粹的值或者某個列的數組。
### 動態查詢
支持數據庫的動態查詢方法,例如:
~~~
// 根據name字段查詢用戶
$user = User::getByName('thinkphp');
// 根據email字段查詢用戶
$user = User::getByEmail('thinkphp@qq.com');
~~~
### 聚合查詢
同樣在模型中也可以調用數據庫的聚合方法查詢,例如:
~~~
User::count();
User::where('status','>',0)->count();
User::where('status',1)->avg('score');
User::max('score');
~~~
注意,如果你的字段不是數字類型,是使用`max`/`min`的時候,需要加上第二個參數。
```
User::max('name', false);
```
### 數據分批處理
模型也可以支持對返回的數據分批處理,這在處理大量數據的時候非常有用,例如:
~~~
User::chunk(100, function ($users) {
foreach($users as $user){
// 處理user模型對象
}
});
~~~
## 使用游標查詢
模型也可以使用數據庫的`cursor`方法進行游標查詢,返回生成器對象
~~~
foreach(User::where('status', 1)->cursor() as $user){
echo $user->name;
}
~~~
`user`變量是一個模型對象實例。
## 最佳實踐
>[info] 模型查詢的最佳實踐原則是:在模型外部使用靜態方法進行查詢,內部使用動態方法查詢,包括使用數據庫的查詢構造器。
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 請求流程
- 架構總覽
- 入口文件
- 多應用模式
- URL訪問
- 容器和依賴注入
- 服務
- 門面
- 中間件
- 事件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 路由參數
- 路由中間件
- 路由分組
- 資源路由
- 注解路由
- 路由綁定
- 域名路由
- MISS路由
- 跨域請求
- URL生成
- 控制器
- 控制器定義
- 基礎控制器
- 空控制器
- 資源控制器
- 控制器中間件
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 數據庫
- 連接數據庫
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- cacheAlways
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 獲取查詢參數
- 查詢事件
- 獲取器
- 事務操作
- 存儲過程
- 數據集
- 數據庫驅動
- 模型
- 定義
- 模型字段
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- JSON字段
- 獲取器
- 修改器
- 搜索器
- 數據集
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 虛擬模型
- 視圖
- 模板變量
- 視圖過濾
- 模板渲染
- 模板引擎
- 視圖驅動
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 表單令牌
- 注解驗證
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 上傳
- 命令行
- 啟動內置服務器
- 查看版本
- 自動生成應用目錄
- 創建類庫文件
- 清除緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 輸出路由定義
- 自定義指令
- Debug輸出級別
- 擴展庫
- 數據庫遷移工具
- Workerman
- think助手工具庫
- 驗證碼
- Swoole
- 附錄
- 助手函數
- 升級指導
- 更新日志