ThinkPHP 提供多樣化的模型實例化方式,滿足從簡單 CRUD 到複雜業務邏輯的不同需求。本文系統整理四種實例化模式,說明適用場景、程式碼範例與注意事項,助你選擇最適合的寫法。
M() / new Model()最常用、最輕量的方式,適合無自定義邏輯的通用資料表操作。
$user = M('User'); // 等同於 new Model('User')
$user = new Model('User'); // 完整寫法
// 直接操作 user 表,不需建立模型類別檔案
think_user (依前綴設定)$user->where(...)->select()CommonModel建立基礎模型類別封裝共用邏輯 (如軟刪除、時間戳自動寫入),具體模型繼承即可複用。
<?php
// CommonModel.class.php
class CommonModel extends Model {
protected $autoWriteTimestamp = true;
public function softDelete($id) {
return $this->where(['id'=>$id])->save(['status'=>-1, 'delete_time'=>time()]);
}
}
// 使用方式
$user = new CommonModel('User'); // 實例化 user 表並擁有 CommonModel 方法
$user->softDelete(123);
UserModel (配合 D())針對單一資料表建立專屬模型類別,封裝完整業務邏輯、驗證規則、關聯關係。
<?php
// UserModel.class.php
class UserModel extends Model {
protected $_validate = array(
array('email', 'email', '信箱格式錯誤'),
array('password', 'require', '密碼必填'),
);
protected $_auto = array(
array('create_time', 'time', self::MODEL_INSERT, 'function'),
array('password', 'md5', self::MODEL_BOTH, 'function'),
);
public function getUserWithProfile($id) {
return $this->relation(true)->find($id);
}
}
// 實例化 (注意大小寫)
$user = D('User'); // 推薦:自動檢測、單例、支援跨模組
$user = new UserModel(); // 手動實例化
D() 會自動快取實例,避免重複實例化_validate、_auto、_link 等進階特性M() / new Model() (無參數)不綁定特定資料表,配合原生 SQL 查詢、跨表操作、動態指定表名。
$model = M(); // 等同 new Model()
$model = new Model();
// 直接執行 SQL
$list = $model->query('SELECT * FROM wp_users WHERE status=1');
// 動態指定表名
$model->table('think_order')->where('uid=1')->select();
// 事務操作
$model->startTrans();
try {
$model->table('user')->save(['score'=>10]);
$model->table('log')->add(['uid'=>1, 'action'=>'add_score']);
$model->commit();
} catch (Exception $e) {
$model->rollback();
}
D('ModelName')CommonModelM('Table')M() + query/executeM('User') 與 D('User') 同時存在時,D() 優先載入自定義模型類別UserModel.class.php (大小寫敏感)D('Admin.User') 格式M() 不支援 _validate/_auto 等自動功能掌握四種實例化方式的差異與適用場景,能讓 ThinkPHP 專案的資料層架構更清晰、維護更輕鬆。