ThinkPHP 提供豐富的查詢語言封裝,支援從簡單條件到複雜組合查詢。本文系統匯總八大類查詢用法,附代碼範例供快速查閱。
$user->where('id > 5 AND id < 9')->select();
$data = ['username' => 'liwenkai']; $user->where($data)->select(); // 或 $user->where(['username' => 'liwenkai'])->select();
$obj = new stdClass(); $obj->username = 'liwenkai'; $user->where($obj)->select();
| 表達式 | SQL 對應 | 範例 |
|---|---|---|
| EQ / = | = | ['id', ['eq', 5]] |
| NEQ / != | != | ['id', ['neq', 5]] |
| GT / > | > | ['id', ['gt', 5]] |
| EGT / >= | >= | ['id', ['egt', 5]] |
| LT / < | < | ['id', ['lt', 10]] |
| ELT / <= | <= | ['id', ['elt', 10]] |
| LIKE | LIKE | ['name', ['like', 'peng%']] |
| [NOT] BETWEEN | BETWEEN | ['id', ['between', '1,10']] |
| [NOT] IN | IN | ['id', ['in', '1,2,3']] |
| EXP | 原生 SQL 片段 | ['id', ['exp', 'IN (SELECT uid FROM log)']] |
簡寫:['username' => 'liwenkai'] 等同 ['username' => ['eq', 'liwenkai']]。
// id > 20 AND id < 23 $data['id'] = [['gt', 20], ['lt', 23], 'and']; $user->where($data)->select(); // username LIKE 'p%' OR username LIKE 'h%' $data['username'] = [['like', 'p%'], ['like', 'h%'], 'or']; $user->where($data)->select();
$data['username'] = 'pengyanjie'; $data['password'] = ['eq', 'pengyanjie']; $data['id'] = ['lt', 30]; $data['_logic'] = 'or'; // 欄位間邏輯:or / and (預設 and) // SQL: (username='pengyanjie' OR password='pengyanjie' OR id<30) $user->where($data)->select();
$where['username'] = ['eq', 'pengyanjie']; $where['password'] = ['like', 'p%']; $where['_logic'] = 'or'; $data['_complex'] = $where; $data['id'] = ['lt', 30]; // SQL: (id < 30) AND ( (username='pengyanjie') OR (password LIKE 'p%') ) $user->where($data)->select();
echo $user->count(); // 總筆數
echo $user->max('id'); // 最大值
echo $user->min('id'); // 最小值
echo $user->avg('id'); // 平均值
echo $user->sum('id'); // 總和
// 帶條件統計
echo $user->where('id < 30')->min('id');
$adv = new AdvModel('user'); // 或 M('user', 'CommonModel')
$adv->order('id DESC')->getN(2); // 第 3 筆 (0-based)
$adv->order('id DESC')->first(); // 第一筆
$adv->order('id DESC')->last(); // 最後一筆
$adv->top5(); // 前 5 筆 (需模型定義)
// 查詢用 query()
$list = M()->query('SELECT * FROM aoli_user ORDER BY id DESC');
// 寫入/更新用 execute()
M()->execute("UPDATE think_user SET name='ThinkPHP' WHERE status=1");
// 根據欄位名動態生成方法
$list = $user->getByUsername('pengyanjie'); // WHERE username='pengyanjie'
$list = $user->getByEmailAndStatus('a@b.com', 1); // WHERE email='a@b.com' AND status=1
| 場景 | 推薦方法 |
|---|---|
| 簡單條件 | 陣列 where() |
| 複雜邏輯群組 | _complex 組合查詢 |
| 統計聚合 | count/max/min/avg/sum |
| 極複雜/效能敏感 SQL | query()/execute() 原生 SQL |
| 動態欄位查詢 | getByXxx() 魔術方法 |
熟練掌握查詢語言,能用最少代碼表達最複雜的資料檢索邏輯,是 ThinkPHP 開發者的核心基本功。