Skip to main content

ページネーションとは

Laravelのページネーションは、クエリビルダーおよびEloquent ORMと統合されており、設定なしで使い始めることができます。現在のページはHTTPリクエストの page クエリパラメーターから自動的に取得され、生成されたリンクにも自動で付加されます。 デフォルトのHTMLはTailwind CSSに対応しており、Bootstrap CSSも選択できます。

3種類のページネーション

基本的な使い方

クエリビルダーのページネーション

Eloquentのページネーション

simplePaginate

総件数のカウントクエリが不要な場合(「前へ」「次へ」リンクのみ表示)は simplePaginate() を使うと効率的です。
「全部で何件中何件目」という表示が不要なら simplePaginate() を選びましょう。paginate()COUNT(*) クエリを追加で実行するため、simplePaginate() の方が高速です。

cursorPaginate(カーソルページネーション)

カーソルページネーションはOFFSET句の代わりにWHERE句を使うため、大量データに対して高いパフォーマンスを発揮します。無限スクロールのUIに特に適しています。
生成されるURLにはページ番号ではなくカーソル文字列が入ります。
カーソルページネーションを使うには orderBy が必須です。また、並び順のカラムはページネーション対象のテーブルに属している必要があります。

OFFSETとカーソルの比較

カーソルページネーションはインデックスが有効活用され、データが頻繁に追加・削除される場合もレコードの重複・欠落が起きにくいという利点があります。ただし、ページ番号リンクの生成はできず、「前へ」「次へ」のみです。

コントローラーでの実装

Bladeでのページネーションリンク表示

links() メソッドが自動でページリンクのHTMLを生成します。現在のページの前後3ページ分のリンクが表示されます。

表示するリンク数の調整

onEachSide() で現在のページの前後に表示するリンク数を変更できます。

1ページあたりの件数をリクエストから受け取る

1ページに複数のページネーターを表示する

同一画面に2つのページネーターを表示する場合、両方が page パラメーターを使うと競合します。第3引数でパラメーター名を変更します。

URLのカスタマイズ

ベースURLの変更

クエリパラメーターの追加

ハッシュフラグメントの追加

APIレスポンス(JSON出力)

ページネーターをルートやコントローラーからそのまま返すと、自動的にJSONに変換されます。
レスポンスのJSON形式:

APIリソースとの組み合わせ

paginate() の結果をAPIリソースコレクションでラップする場合は UserResource::collection() に渡します。
UserResource::collection() にページネーターを渡すと、ページネーション情報がメタデータとして自動で付加されます。
cursorPaginate() のJSONにはページ番号ではなく next_cursorprev_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を使う場合は AppServiceProviderboot() で指定します。

手動でページネーターを作成する

配列などの既存データにページネーションを適用したい場合、ページネータークラスを直接インスタンス化します。

よく使うインスタンスメソッド

まとめ

  • paginate() — 総件数とページ番号リンクが必要な場合(一般的なリスト画面)
  • simplePaginate() — 「前へ」「次へ」リンクのみで十分な場合(高速)
  • cursorPaginate() — 大量データ・無限スクロール・頻繁な書き込みがある場合(最高パフォーマンス)
paginate() の結果をビューに渡し、links() でページリンクを出力するだけです。 現在のページは page クエリパラメーターから自動で検出されます。
ページネーターをルートから直接返すと自動的にJSONに変換されます。 APIリソースと組み合わせるには UserResource::collection($paginator) を返します。 レスポンスには data(レコード配列)と各種メタ情報が含まれます。
最終更新日 2026年3月29日