ページングクエリ


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>

If 合計データを個別に取得する必要がある場合は、

// 查询状态为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 クエリと一部の特殊な複雑なクエリの場合、次のようになります。このメソッドを使用して最初にレコードの総数を個別にクエリし、それをページング メソッドに渡すことを推奨します。

ページング後のデータ処理

直接の各トラバーサル処理をサポートします。クラスのページング後にデータを追加できるため、モデルのゲッターを介してフィールドを追加するだけでなく、ページング後にデータを変更するのが便利になります。

$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){
    $item['nickname'] = 'think';
    return $item;
});

モデル クラスがページング データを操作する場合、各メソッドのクロージャー関数で戻り値を使用する必要はありません。たとえば、次のようになります。

$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>

Concise ページング モードではクエリするデータの総数が必要ないため、クエリのパフォーマンスを向上させることができます。

ページング パラメータ

主なページング パラメータは次のとおりです:

パラメータ説明
list_rowsページごとの数
page現在のページ
pathurl path
queryurl 追加パラメータ
フラグメントurl アンカー
var_pageページング変数

ページング メソッドを呼び出すときに、ページング パラメータの設定を渡すことができます。例:

$list = Db::name('user')->where('status',1)->paginate([
    'list_rows'=> 20,
    'var_page' => 'page',
]);

ページング時にクエリ条件を渡す必要がある場合は、クエリ パラメータを使用して追加のクエリ パラメータを結合できます。

ビッグ データ ページネーション

大量のデータのページング クエリのために、システムは高性能の paginateX ページング クエリ メソッドを提供します。使用方法はページネーション ページングとは多少異なります。クエリ。ページごとにクエリするデータの量が 100 万を超える場合、特にページ数が多い場合は、paginateX メソッドを使用すると大幅に改善されます。また、大規模なデータ量向けに設計されているため、このページング クエリではシンプル ページング モードのみを使用できるため、合計数はありません。

ページング クエリの並べ替えフィールドはインデックス フィールドを使用し、連続整数である必要があります。そうしないとデータが失われます。

主なシナリオは、主キーに基づいてページング クエリを実行することです。デフォルトでは、ページング データは主キーの逆の順序でクエリされます。

$list = Db::name('user')->where('status',1)->paginateX(20);

クエリ時に主キーと並べ替えを指定することもできます

$list = Db::name('user')->where('status',1)->paginateX(20, 'id', 'desc');

クエリ メソッドは 2 つのクエリを実行します。最初のクエリは、現在のクエリを満たす最大値または最小値を見つけるために使用されます。次に、主キーのクエリ条件を使用してページング データ クエリを実行します。

カスタム ページング クラス

ページングをカスタマイズする必要がある場合は、ページング ドライバーを拡張できます。

次に、provider.php 定義ファイルで再バインドします

return [
    'think\Paginator'    =>    'app\common\Bootstrap'
];