## 模型定義
定義一個模型類很簡單,例如下面是一個`User`模型:
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
}
~~~
>[info] 請確保你已經在數據庫配置文件中配置了數據庫連接信息,如不清楚請參考數據庫一章
模型會自動對應數據表,模型類的命名規則是除去表前綴的數據表名稱,采用駝峰法命名,并且首字母大寫,例如:
| 模型名 | 約定對應數據表(假設數據庫的前綴定義是 `think_`) |
|-----|-----|
| User | think_user |
| UserType | think_user_type |
如果你的規則和上面的系統約定不符合,那么需要設置Model類的數據表名稱屬性,以確保能夠找到對應的數據表。
>[danger] 模型自動對應的數據表名稱都是遵循小寫+下劃線規范,如果你的表名有大寫的情況,必須通過設置模型的`table`屬性。
如果你希望給模型類添加后綴,需要設置`name`屬性或者`table`屬性。
~~~
<?php
namespace app\model;
use think\Model;
class UserModel extends Model
{
protected $name = 'user';
}
~~~
## 模型設置
默認主鍵為`id`,如果你沒有使用`id`作為主鍵名,需要在模型中設置屬性:
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
protected $pk = 'uid';
}
~~~
如果你想指定數據表甚至數據庫連接的話,可以使用:
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
// 設置當前模型對應的完整數據表名稱
protected $table = 'think_user';
// 設置當前模型的數據庫連接
protected $connection = 'db_config';
}
~~~
>[danger] `connection`屬性使用用配置參數名(需要在數據庫配置文件中的`connections`參數中添加對應標識)。
常用的模型設置屬性包括(以下屬性都不是必須設置):
屬性|描述
---|---
name|模型名(相當于不帶數據表前后綴的表名,默認為當前模型類名)
table|數據表名(默認自動獲取)
suffix|數據表后綴(默認為空)
pk|主鍵名(默認為`id`)
connection|數據庫連接(默認讀取數據庫配置)
query|模型使用的查詢類名稱
field|模型允許寫入的字段列表(數組)
schema|模型對應數據表字段及類型
type|模型需要自動轉換的字段及類型
strict|是否嚴格區分字段大小寫(默認為true)
disuse|數據表廢棄字段(數組)
>[danger] 模型不支持對數據表的前綴單獨設置,并且也不推薦使用數據表的前綴設計,應該用不同的庫區分。當你的數據表沒有前綴的時候,`name`和`table`屬性的定義是沒有區別的,定義任何一個即可。
## 模型初始化
模型支持初始化,只需要定義`init`方法,例如:
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
// 模型初始化
protected static function init()
{
//TODO:初始化內容
}
}
~~~
>[danger] `init`必須是靜態方法,并且只在第一次實例化的時候執行,并且只會執行一次
## 模型操作
> 在模型中除了可以調用數據庫類的方法之外(換句話說,**數據庫的所有查詢構造器方法模型中都可以支持**),可以定義自己的方法,所以也可以把模型看成是數據庫的增強版。
模型的操作方法無需和數據庫查詢一樣調用必須首先調用`table`或者`name`方法,因為模型會按照規則自動匹配對應的數據表,例如:
~~~
Db::name('user')->where('id','>',10)->select();
~~~
改成模型操作的話就變成
~~~
User::where('id','>',10)->select();
~~~
雖然看起來是相同的查詢條件,但一個最明顯的區別是**查詢結果的類型**不同。第一種方式的查詢結果是一個(二維)數組,而第二種方式的查詢結果是包含了模型(集合)的數據集。不過,在大多數情況下,這二種返回類型的使用方式并無明顯區別。
模型操作和數據庫操作的另外一個顯著區別是模型支持包括獲取器、修改器、自動時間寫入在內的一系列自動化操作和事件,簡化了數據的存取操作,但隨之而來的是性能有所下降(其實并沒下降,而是自動幫你處理了一些原本需要手動處理的操作),后面會逐步領略到模型的這些特色功能。
## 動態切換后綴
新版模型增加了一個數據表后綴屬性,可以用于多語言或者數據分表的模型查詢,省去為多個相同結構的表定義多個模型的麻煩。
默認的數據表后綴可以在模型類里面直接定義`suffix`屬性。
~~~
<?php
namespace app\model;
use think\Model;
class Blog extends Model
{
// 定義默認的表后綴(默認查詢中文數據)
protected $suffix = _cn';
}
~~~
>[danger] 你在模型里面定義的`name`和`table`屬性無需包含后綴定義
模型提供了動態切換方法`suffix`和`setSuffix`,例如:
```
// suffix方法用于靜態查詢
$blog = Blog::suffix('_en')->find();
$blog->name = 'test';
$blog->save();
// setSuffix用于動態設置
$blog = new Blog($data);
$blog->setSuffix('_en')->save();
```
## 模型方法依賴注入
如果你需要對模型的方法支持依賴注入,可以把模型的方法改成閉包的方式,例如,你需要對獲取器方法增加依賴注入
```
public function getTestFieldAttr($value,$data) {
return $this->invoke(function(Request $request) use($value,$data) {
return $data['name'] . $request->action();
});
}
```
不僅僅是獲取器方法,在任何需要依賴注入的方法都可以改造為調用`invoke`方法的方式,`invoke`方法第二個參數用于傳入需要調用的(數組)參數。
如果你需要直接調用某個已經定義的模型方法(假設已經使用了依賴注入),可以使用
```
protected function bar($name, Request $request) {
// ...
}
protected function invokeCall(){
return $this->invoke('bar',['think']);
}
```
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 請求流程
- 架構總覽
- 入口文件
- 多應用模式
- 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
- 附錄
- 助手函數
- 升級指導
- 更新日志