limit() 是模型類連貫操作核心方法之一,直接映射 SQL LIMIT 子句。支援單參數(數量)、雙參數(偏移,數量)、字符串 'offset,count' 三種形式,適用於查詢、更新、刪除等所有操作。
$Model = M('Article');
// 單參數:前 N 條
$Model->where('status=1')->limit(10)->select();
// LIMIT 10
// 雙參數:偏移量, 數量 (3.1+ 推薦)
$Model->limit(10, 25)->select();
// LIMIT 10, 25
// 字符串兼容寫法
$Model->limit('10,25')->select();
// LIMIT 10, 25
public function index($page = 1, $pageSize = 15) {
$page = max(1, (int)$page);
$offset = ($page - 1) * $pageSize;
$list = M('Article')
->where('status=1')
->order('id DESC')
->limit($offset, $pageSize)
->select();
return $list;
}
// 僅更新前 3 條符合條件的記錄
M('User')->where('score=100')->limit(3)->save(['level' => 'A']);
// 僅刪除前 5 條軟刪除標記
M('Log')->where('created_at < "2023-01-01"')->limit(5)->delete();
當表超過百萬行,LIMIT 100000, 20 需掃描並丟棄前 10 萬行,性能急劇下降。解決方案:基於主鍵游標。
// 首頁
$list = M('Article')->where('status=1')->order('id')->limit(20)->select();
$lastId = $list ? end($list)['id'] : 0;
// 翻頁:客戶端傳遞 last_id
$list = M('Article')
->where('status=1')
->where('id', '>', $lastId) // 或 ->where(['id' => ['GT', $lastId]])
->order('id')
->limit(20)
->select();
優勢:利用主鍵索引直接定位,時間複雜度 O(log n) + O(limit),與頁數無關。
TOP/ROWNUM/OFFSET FETCH)。'offset,count'。| 誤區 | 正確理解 |
|---|---|
| limit(0,10) 返回前 10 條 | offset=0 即首頁,正確;但 limit(0) 表示 0 條(空結果) |
| 負數 offset 合法 | 不合法,會報錯或返回空 |
| limit() 影響 count(*) | 不影響,count 查詢不帶 LIMIT |
limit(),防止全表掃描導致 OOM。(int)$_GET['page'],防注入。limit(1) 保護,防誤更新全表。