分頁查詢
ThinkPHP內建了分頁實現,要為資料添加分頁輸出功能變得非常簡單,可以直接在Db類查詢的時候調用paginate方法:
// 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10); // 渲染模板输出 return view('index', ['list' => $list]);
模板檔案中分頁輸出程式碼如下:
<div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$list|raw}
範本檔案中分頁輸出程式碼如下:
<div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$list|raw}
也可以單獨賦值分頁輸出的範本變數
// 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10); // 获取分页显示 $page = $list->render(); return view('index', ['list' => $list, 'page' => $page]);
範本檔案中分頁輸出程式碼如下:
<div> <ul> {volist name='list' id='user'} <li> {$user.nickname}</li> {/volist} </ul> </div> {$page|raw}
預設情況下,產生的分頁輸出是完整分頁功能,帶有總分頁資料和上下頁碼,分頁樣式只需要透過樣式修改即可,完整分頁預設產生的分頁輸出程式碼為:
<ul class="pagination"> <li><a href="?page=1">«</a></li> <li><a href="?page=1">1</a></li> <li class="active"><span>2</span></li> <li class="disabled"><span>»</span></li> </ul>
如果你需要單獨取得總的數據,可以使用
// 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->order('id' ,'desc')->paginate(10); // 获取总记录数 $count = $list->total(); return view('index', ['list' => $list, 'count' => $count]);
傳入總記錄數
支援傳入總記錄數而不會自動進行總數計算,例如:
// 查询状态为1的用户数据 并且每页显示10条数据 总记录数为1000 $list = Db::name('user')->where('status',1)->paginate(10,1000); // 获取分页显示 $page = $list->render(); return view('index', ['list' => $list, 'page' => $page]);
對於UNION查詢以及一些特殊的複雜查詢,建議使用這種方式先單獨查詢總記錄數,然後再傳入分頁方法
##分頁後資料處理
支援分頁類別後資料直接each遍歷處理,方便修改分頁後的數據,而不是只能透過模型的擷取器來補充欄位。$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){ $item['nickname'] = 'think'; return $item; });如果是模型類別操作分頁資料的話,each方法的閉包函數中不需要使用回傳值,例如:
$list = User::where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){ $item->nickname = 'think'; });
簡潔分頁
// 查询状态为1的用户数据 并且每页显示10条数据 $list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10, true); // 渲染模板输出 return view('index', ['list' => $list]);簡潔分頁模式的輸出代碼為:
<ul class="pager"> <li><a href="?page=1">«</a></li> <li class="disabled"><span>»</span></li> </ul>由於簡潔分頁模式不需要查詢總資料數,因此可以提高查詢效能。
分頁參數
主要的分頁參數如下:描述 | |
每頁數量 | |
目前頁 | |
path | |
query |
分頁參數的設定可以在呼叫分頁方法的時候傳入,例如:
$list = Db::name('user')->where('status',1)->paginate([ 'list_rows'=> 20, 'var_page' => 'page', ]);
如果需要在分頁的時候傳入查詢條件,可以使用query參數拼接額外的查詢參數
大數據分頁
對於大量資料的分頁查詢,系統提供了一個高效能的paginateX分頁查詢方法,用法和paginate分頁查詢有一定差異。如果你要分頁查詢的資料量在百萬級以上,使用paginateX方法會有明顯的提升,尤其是在分頁數較大的情況下。並且由於針對大數據量而設計,該分頁查詢只能採用簡潔分頁模式,所以沒有總數。
分頁查詢的排序字段一定要使用索引字段,並且是連續的整數,否則會有資料遺漏。
主要場景是針對主鍵進行分頁查詢,預設使用主鍵倒序查詢分頁資料。
$list = Db::name('user')->where('status',1)->paginateX(20);
也可以在查詢的時候可以指定主鍵和排序
$list = Db::name('user')->where('status',1)->paginateX(20, 'id', 'desc');
查詢方法會執行兩次查詢,第一次查詢用於查找滿足當前查詢條件的最大或最小值,然後配合主鍵查詢條件進行分頁資料查詢。
自訂分頁類別
如果你需要自訂分頁,可以擴充一個分頁驅動程式。
然後在provider.php定義檔中重新綁定
return [ 'think\Paginator' => 'app\common\Bootstrap' ];