LaravelのPaginateを使いこなそう:初心者向けにわかりやすく解説

はじめに

皆さんはWebアプリケーションで膨大なデータを一覧表示するとき、どのように見せていますか。 ページ全体をスクロールさせるだけでは、データ量が増えると表示が遅くなるかもしれません。 そこで役立つのが、LaravelのPaginate機能です。

この機能を使えば、ユーザーが扱いやすい形でページネーションを実装できます。 テーブルに大量のデータがあるときも、数件ずつ区切って表示できるので、とても見やすく管理しやすいですね。

本記事では、Laravelの最新バージョンにおけるPaginate機能の基本から応用までを初心者向けに解説します。 実務における活用シーンを交えながら説明しますので、皆さんの学習に役立ててみてください。

ページネーションを導入してユーザビリティを高めると、アプリケーション全体の操作感が向上することがあります。

LaravelのPaginateとは

LaravelのPaginateは、データを分割して複数ページにわたって表示する仕組みです。 Eloquentを利用している場合、クエリビルダによるデータ取得が簡単にページネーションできるように作られています。

例えば、Userモデルからユーザー情報を取得するとき paginate()メソッドを使って指定した件数だけデータを取得し、残りはページ分割して自動でリンクを生成してくれます。 リンク部分のテンプレートもあらかじめ用意されているため、Bladeファイルで簡単に使えます。

これにより、データ量が多いときでも、ユーザーが数件ずつ快適に見られる状態を作れるのが魅力です。 直接手動でリンクを作成してページ番号を管理する必要はなく、Laravelが裏側で処理を済ませてくれます。

基本的な使い方

EloquentとPaginate

Laravelでページネーションを使う場合、多くの方がEloquentモデルを利用します。 たとえば、ユーザー情報を表示したいときは以下のように書くことが多いです。

// routes/web.php などに設定されたコントローラ内
public function index()
{
    $users = User::paginate(10);

    return view('users.index', compact('users'));
}

User::paginate(10) では、1ページあたり10件のデータを取得しています。 もし50人のユーザーが存在するなら、5ページに分割される仕組みです。

Bladeテンプレートでの活用

コントローラで取得した $users をBladeファイルに渡すだけで、ページネーションリンクが利用できます。 表示部分は以下のように書きます。

<!-- resources/views/users/index.blade.php -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ユーザー一覧</title>
</head>
<body>
    <h1>ユーザー一覧</h1>

    <ul>
        @foreach($users as $user)
            <li>{{ $user->name }}</li>
        @endforeach
    </ul>

    <!-- ページネーションリンク -->
    {{ $users->links() }}
</body>
</html>

{{ $users->links() }} は、Laravelが用意しているヘルパーです。 この一文で「前へ」「次へ」「ページ番号」などが含まれたリンクが表示されます。

これだけで、初めての方でもサクッとページネーションを実装しやすいですね。

PaginateとSimplePaginateの違い

paginate() と simplePaginate()

Laravelには paginate() のほかに simplePaginate() も用意されています。 simplePaginate() は、総件数をカウントしない分、内部処理が軽くなる特徴があります。

大量のレコードがあるテーブルで、総件数を表示する必要がないケースなら、単純に次ページへ進むだけで十分かもしれません。 そのときは simplePaginate() を使うことでクエリの負荷を軽減できます。

ただし simplePaginate() では、最終ページやページ数の合計といった詳細情報は取得できません。 必要な情報に応じて、どちらのメソッドを使うか判断してみましょう。

Paginateのカスタマイズ

表示件数を自由に変える

paginate(10) の数値部分を変えるだけで、1ページあたりの表示件数を自由に設定できます。 たとえば、以下のように書くと、1ページに20件表示するようになります。

$users = User::paginate(20);

この数値を動的に変えたい場合は、リクエストパラメータを受け取って制御する方法もあります。 ただしユーザーが極端に大きな件数を指定したときは、アプリケーションに負荷がかかる可能性があるので、上限を決めておくと安心です。

ページネーションリンクのレイアウト

links() メソッドはデフォルトのレイアウトを使用していますが、カスタムレイアウトに変更することもできます。 Laravelではペジネーションのビューを自由に差し替えられる仕組みを備えています。

たとえば、resources/views/vendor/pagination/ 内にオリジナルのBladeを作成し、そこに独自のHTML構造やCSSクラスを定義すると、見た目を大きく変更できます。 社内システムなど、見た目をシンプルにしたい場合にも役立ちますね。

ページ番号以外のカスタム要素

ときにはページネーションのリンクにアイコンを付けたい場面もあるでしょう。 Font Awesomeなどを読み込んで、Bladeの中でアイコンタグを使用するだけでも、ページナビゲーションをグラフィカルに見せられます。

また、モバイル向けにデザインを変えたい場合は、CSSメディアクエリやフレームワーク(Tailwind CSSやBootstrapなど)と組み合わせてカスタマイズすることが多いです。

応用的な使い方

検索やフィルターとの併用

データを表示するとき、ただ一覧にするだけでなく、検索キーワードやカテゴリーで絞り込みたいケースはよくあります。 Laravelでは、以下のようにクエリビルダを使って検索条件を追加した上で、最後に paginate() を呼び出すことができます。

public function index(Request $request)
{
    $query = User::query();

    if ($request->filled('keyword')) {
        $keyword = $request->input('keyword');
        $query->where('name', 'like', '%' . $keyword . '%');
    }

    $users = $query->paginate(10);

    return view('users.index', compact('users'));
}

こうすると、検索キーワードが入力されていた場合だけ、該当するレコードをページネーション付きで表示できます。 カテゴリーや日付の範囲指定も同様に書けば、より高度なフィルタリングが実現しやすいですね。

cursorPaginate() の活用

Laravelの最新バージョンでは、cursorPaginate() という方法も用意されています。 これはデータが膨大に増えても快適にページめくりできるように考えられた手法です。

cursorPaginate() は、指定のカラムを基準にしてカーソルを用いたページ送りを実現します。 大きなIDを持つテーブルなどでは特に効果を発揮し、メモリ使用量を抑えて連続的にデータを取得できます。

ただし、実装時にはソート順やインデックスの設計に注意が必要です。 使うタイミングを誤ると期待通りの結果にならないこともあるので、ドキュメントをしっかり確認しましょう。

実務での具体的な活用シーン

大量データが格納された会員管理システム

企業の会員登録システムでは、ユーザー数が増え続けることがよくあります。 何万件、何十万件といったデータ量になると、一度に全データを表示するとブラウザが重くなることもあるでしょう。

そんなとき、ページネーションを使って20件や50件ずつ区切れば、ブラウザへの負担が減ります。 管理画面のUIとしてもわかりやすくなり、担当者も欲しい情報へアクセスしやすくなるはずです。

商品一覧の表示やブログの記事リスト

ECサイトの商品一覧やブログの一覧ページでもよく使われます。 並び順を「新着順」「人気順」「価格順」などに切り替えながらページめくりをする場合にも、paginate()simplePaginate() が利用されます。

大量の商品データを扱うときは、検索やフィルタリングを組み合わせることが多いです。 ページネーションと検索フォームを連動させる実装パターンは、実務でも頻繁に登場します。

Paginateを使う際の注意点

既存ページとのパラメータ競合

ページネーションはクエリパラメータ ?page=2 のような形式でページ番号を切り替えます。 もし他のパラメータと組み合わせる場合、同じ名前のパラメータが衝突しないように気を付ける必要があります。

例えば、検索用のパラメータ keyword と一緒に使うなら、 ?keyword=xxx&page=2 のようになるのが一般的です。 また、ページ番号を任意の名称に変えたい場合は、->appends() などを活用してURLを構築していきます。

パフォーマンス上の考慮

データベースからの取得件数が膨大な場合、クエリが重くなってページ切り替えに時間がかかるかもしれません。 simplePaginate()cursorPaginate() を使う、あるいはキャッシュを導入するなどの対策が必要になる場合があります。

とくに検索機能を組み合わせるときは、インデックス設計が重要です。 テーブルの構造や検索条件を整理して、効率的なクエリを実行できるように心がけると快適なアプリケーションが作れます。

ページネーション処理が多重に走ると想定外の負荷がかかることがあります。実装時には適宜ログを確認し、パフォーマンスを見極めましょう。

まとめ

ここまで、LaravelのPaginate機能について基本から応用まで順を追って解説しました。 単純にデータを区切るだけでなく、検索やフィルタリングと組み合わせることで、より使いやすいページネーションを作れます。

必要に応じて simplePaginate()cursorPaginate() を使い分けると、大量データを扱う場面でも負荷を抑えられます。 また、ページリンクのレイアウトやアイコン表示をカスタマイズすれば、UIデザインも柔軟に作り込めます。

普段のWebアプリケーション開発でデータが増えそうなシーンがあれば、ぜひ試してみてください。 Laravelの力を借りることで、皆さんの作りたい機能をわかりやすく実現しやすくなるのではないでしょうか。

Laravelをマスターしよう

この記事で学んだLaravelの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。