ページネーションとは
Laravelのページネーションは、クエリビルダーおよびEloquent ORMと統合されており、設定なしで使い始めることができます。現在のページはHTTPリクエストのpage クエリパラメーターから自動的に取得され、生成されたリンクにも自動で付加されます。
デフォルトのHTMLはTailwind CSSに対応しており、Bootstrap CSSも選択できます。
3種類のページネーション
基本的な使い方
クエリビルダーのページネーション
Eloquentのページネーション
simplePaginate
総件数のカウントクエリが不要な場合(「前へ」「次へ」リンクのみ表示)はsimplePaginate() を使うと効率的です。
cursorPaginate(カーソルページネーション)
カーソルページネーションはOFFSET句の代わりにWHERE句を使うため、大量データに対して高いパフォーマンスを発揮します。無限スクロールのUIに特に適しています。OFFSETとカーソルの比較
コントローラーでの実装
Bladeでのページネーションリンク表示
links() メソッドが自動でページリンクのHTMLを生成します。現在のページの前後3ページ分のリンクが表示されます。
表示するリンク数の調整
onEachSide() で現在のページの前後に表示するリンク数を変更できます。
1ページあたりの件数をリクエストから受け取る
1ページに複数のページネーターを表示する
同一画面に2つのページネーターを表示する場合、両方がpage パラメーターを使うと競合します。第3引数でパラメーター名を変更します。
URLのカスタマイズ
ベースURLの変更
クエリパラメーターの追加
ハッシュフラグメントの追加
APIレスポンス(JSON出力)
ページネーターをルートやコントローラーからそのまま返すと、自動的にJSONに変換されます。APIリソースとの組み合わせ
paginate() の結果をAPIリソースコレクションでラップする場合は UserResource::collection() に渡します。
UserResource::collection() にページネーターを渡すと、ページネーション情報がメタデータとして自動で付加されます。
cursorPaginate() のJSONにはページ番号ではなく next_cursor と prev_cursor が含まれます。APIクライアントはこれらの値を次のリクエストの cursor パラメーターとして使います。カスタムページネーションビュー
ビューファイルに直接指定
デフォルトビューをカスタムファイルに変更
まず公式のビューを公開してからカスタマイズします。resources/views/vendor/pagination/ に以下のファイルが生成されます。
tailwind.blade.php— デフォルト(Tailwind CSS用)bootstrap-5.blade.php— Bootstrap 5用simple-tailwind.blade.php— simplePaginate用- …
tailwind.blade.php を直接編集するか、新しいビューを作成して AppServiceProvider で指定します。
Bootstrap CSSを使う
TailwindではなくBootstrapを使う場合はAppServiceProvider の boot() で指定します。
手動でページネーターを作成する
配列などの既存データにページネーションを適用したい場合、ページネータークラスを直接インスタンス化します。よく使うインスタンスメソッド
まとめ
ページネーション方式の選び方
ページネーション方式の選び方
paginate()— 総件数とページ番号リンクが必要な場合(一般的なリスト画面)simplePaginate()— 「前へ」「次へ」リンクのみで十分な場合(高速)cursorPaginate()— 大量データ・無限スクロール・頻繁な書き込みがある場合(最高パフォーマンス)
Blade表示の基本パターン
Blade表示の基本パターン
paginate() の結果をビューに渡し、links() でページリンクを出力するだけです。
現在のページは page クエリパラメーターから自動で検出されます。APIでのページネーション
APIでのページネーション
ページネーターをルートから直接返すと自動的にJSONに変換されます。
APIリソースと組み合わせるには
UserResource::collection($paginator) を返します。
レスポンスには data(レコード配列)と各種メタ情報が含まれます。