ThinkPHP 的 ORM (M/D 模型) 提供流暢接口封裝常用 SQL。本文以 user 表為例,對照原生 SQL 與 ThinkPHP 方法,附帶進階查詢技巧。
| 操作 | 原生 SQL | ThinkPHP 代碼 | 說明 |
|---|---|---|---|
| 查詢所有 | SELECT * FROM user | M('user')->select() | 返回二維數組 |
| 查詢單條 (PK) | SELECT * FROM user WHERE id=2 | M('user')->find(2) | 返回一維數組 |
| 指定字段查詢 | SELECT username FROM user | M('user')->field('username')->select() | field 支持字符串/數組 |
| 刪除 (PK) | DELETE FROM user WHERE id=2 | M('user')->delete(2) | 返回影響行數 |
| 更新 (PK) | UPDATE user SET username='new' WHERE id=2 | $data=['username'=>'new']; M('user')->save($data) | save 需包含主鍵值 |
| 新增 | INSERT INTO user (name,pwd) VALUES ('php','phpPwd') | $data=['name'=>'php','pwd'=>'phpPwd']; M('user')->add($data) | 返回自增 ID |
// 字符串條件
M('user')->where('status=1 AND score>80')->select();
// 數組條件 (推薦,自動防注入)
M('user')->where(['status'=>1, 'score'=>['gt', 80]])->select();
// 表達式查詢
M('user')->where('name', 'like', '%張%')->select();
M('user')->where('id', 'in', [1,2,3])->select();
M('user')->where('create_time', 'between', ['2023-01-01', '2023-12-31'])->select();
// 複雜邏輯
M('user')->where([
'status' => 1,
'_complex' => [
['role' => 'admin'],
['role' => 'editor', '_logic' => 'OR']
]
])->select();
// 生成:status=1 AND (role='admin' OR role='editor')
M('user')
->field('id,username,email')
->where('status', 1)
->order('create_time DESC')
->limit(10, 20) // offset 10, limit 20
->page(3, 15) // 第3頁,每頁15條 (內部轉為 limit)
->select();
M('user')->count(); // COUNT(*)
M('user')->max('score'); // MAX(score)
M('user')->min('score'); // MIN(score)
M('user')->avg('score'); // AVG(score)
M('user')->sum('balance'); // SUM(balance)
// 查詢
M()->query("SELECT * FROM user WHERE id > ?", [100]);
// 寫入 (返回影響行數)
M()->execute("UPDATE user SET login_count = login_count + 1 WHERE id = ?", [123]);
M()->startTrans();
try {
M('user')->save(['id'=>1, 'balance'=>100]);
M('order')->add(['user_id'=>1, 'amount'=>100]);
M()->commit();
} catch (\Exception $e) {
M()->rollback();
throw $e;
}
M('User') 直接操作表,D('User') 載入模型類(含自動驗證、完成、業務邏輯)fields 屬性或數據庫視圖處理page($page, $listRows) 內部自動計算 limit,配合 Page 類生成分頁 HTMLM('user')->getLastSql() 獲取上條執行 SQLselect/find/add/save/delete 後查詢條件自動重置熟練掌握 ORM 鏈式操作,能大幅減少手寫 SQL,提升開發效率並降低注入風險。