分頁查詢


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">&laquo;</a></li>
<li><a href="?page=1">1</a></li>
<li class="active"><span>2</span></li>
<li class="disabled"><span>&raquo;</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">&laquo;</a></li>
<li class="disabled"><span>&raquo;</span></li>
</ul>

由於簡潔分頁模式不需要查詢總資料數,因此可以提高查詢效能。

分頁參數

主要的分頁參數如下:

參數描述list_rows每頁數量#page目前頁pathurl路徑query#url額外參數
#########fragment## ####url錨點############var_page######分頁變數############

分頁參數的設定可以在呼叫分頁方法的時候傳入,例如:

$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'
];