ThinkPHP 提供多種模型實例化方式,適用不同業務複雜度與架構需求。理解四種方法的差異與適用場景,能寫出更彈性、可維護的資料層代碼。
| 方法 | 語法 | 特點 | 適用場景 |
|---|---|---|---|
| 1. 基礎模型 (M) | M('TableName') | 實例化內建 Model 類,直接操作表,單例模式 | 簡單 CRUD、無自訂邏輯、臨時查詢 |
| 2. 自訂模型 (D - 字串) | D('ModelName') | 實例化專案 Lib/Model/ 下自訂 Model 類,單例 | 含業務邏輯、驗證、關聯、自動完成的標準模型 |
| 3. 跨模組/指定表的自訂模型 | M('TableName', 'ModelName') 或 D('Module.Model') | 指定表名 + 自訂模型類,或跨專案模組調用模型 | 共用模型邏輯操作不同表、跨模組調用 |
| 4. 直接 new Model | new Model() / new UserModel() | 非單例、每次新建實例,可直接寫 SQL | 複雜原生 SQL、多實例並行、測試模擬 |
// Model/TestModel.class.php (可選,不建立也能用)
class TestModel extends Model {}
// Controller
public function test() {
$test = M('test'); // 操作 test 表
// 等同於 new TestModel();
$list = $test->select();
dump($list);
}
// Model/UserModel.class.php
class UserModel extends Model {
public function pyj() { echo 'pengyanjie'; }
// 可定義 _validate、_auto、關聯模型等
}
// Controller
public function user() {
$user = D('User'); // 實例化 UserModel
// 等同於 new UserModel();
$user->pyj(); // 呼叫自訂方法
}
public function love() {
// 操作 test 表,但使用 UserModel 的邏輯 (含 pyj 等方法)
$love = M('test', 'UserModel');
// 等同於 new UserModel('test');
$list = $love->select();
dump($list);
$love->pyj(); // 可用 UserModel 方法
}
public function user() {
$user = new UserModel(); // 每次新實例
$list = $user->select();
dump($list);
echo $user->aa();
}
// Model/UserModel.class.php
class UserModel extends Model {
// 類名 User 對應表 user,無需傳表名
public function aa() { echo 'pengyanjie'; }
}
$model = new Model(); // 或 M()
$list = $model->query('SELECT * FROM think_user WHERE status=1');
// 需手動加表前綴,適用複雜 JOIN、UNION 等 ORM 難表達的查詢
| 特性 | D('Model') | new Model() |
|---|---|---|
| 單例模式 | 是 (同模型同請求只建一次) | 否 (每次新建) |
| 自動檢測類檔案 | 是 (不存在拋異常) | 否 (需自行 require) |
| 跨模組調用 | 支援 D('Admin.User') | 需完整路徑 new \Admin\Model\UserModel() |
| 適用場景 | 標準 Controller 動作 | 測試、腳本、多實例並行 |
// 前台 Controller 調用後台 Admin 模組的 User 模型
$user = D('Admin.User'); // 方式一
$user = D('Admin', 'User'); // 方式二
選擇原則:**標準業務用 D()**,複雜報表/原生 SQL 用 new Model() 或 M()->query(),跨模組共用邏輯用 D('Module.Model')。