Laravelでページネーションを実装する方法

Laravelでは、ページネーションがとても簡単に実装できるようになっています。
クエリビルダ・ORMに統合されており、データを簡単にページネーションすることができます。

今回は、

  • ページネーションの実装方法
  • ページネーションのHTMLのカスタマイズ
  • APIでページネーションする方法

についてまとめました。

ページネーションの実装

Laravel ページネーション

スクショのように、Posts(記事)テーブルの一覧をページネーションするとします。

ソースコードの必要な部分だけ抜粋します。

# PostsController.php

$posts = Post::paginate(10);

return view('posts', [
    'posts' => $posts,
]);
# posts.blade.php

<ul class="list-group">
    @foreach ($posts as $post)
        <li class="list-group-item">
            {{ $post->title }}
        </li>
    @endforeach
</ul>

<div class="d-flex justify-content-center">
    {{ $posts->links() }}
</div>
  • データ取得時に、paginate関数を使う。(引数で1ページ当たりの件数を指定する)
  • ビューで、ページネーションを表示したい箇所にlinks関数を実行する。

必要なことは、こちらの2つのみです。簡単ですね。

ページネーションのリンクは、クエリパラメータでpage=○がついています。pageパラメータの数値により現在のページが決定されています。

paginate関数の他に、simplePaginateが使用できます。こちらを使うと「前へ」「次へ」のリンクのみが生成されます。

Laravel ページネーション(simplePaginate)

こんな感じです。

独自ビューを利用する方法

links関数で生成されるビューは、Laravelに内包されています。
下記のコマンドを実行してファイルを変更できるようにします。

php artisan vendor:publish --tag=laravel-pagination

実行すると、resources/views/vendor/paginationディレクトリ以下に、ページネーションのビューファイルが設置されます。

いくつかファイルが設置されていますが、デフォルトではbootstrap-4.blade.phpが使われるようになっています。

試しに「前へ」「次へ」の文言を変更してみると、こちらのようになります。

Laravel ページネーション(simplePaginate)

APIでページネーションする方法

APIで利用する場合もpaginate関数を利用します。

return Post::paginate(10);

とするとレスポンスでは、ページネーションされた結果とページネーションの情報が得られます。

{
    "current_page": 1,
    "first_page_url": "http://localhost:8000?page=1",
    "from": 1,
    "last_page": 10,
    "last_page_url": "http://localhost:8000?page=10",
    "next_page_url": "http://localhost:8000?page=2",
    "path": "http://localhost:8000",
    "per_page": 10,
    "prev_page_url": null,
    "to": 10,
    "total": 100,

    "data": [
        {
            "id": 1,
            "title": "記事11",
            "created_at": "2018-11-20 00:20:05",
            "updated_at": "2018-11-20 00:20:05"
        },

        ...

        {
            "id": 10,
            "title": "記事12",
            "created_at": "2018-11-20 00:20:05",
            "updated_at": "2018-11-20 00:20:05"
        }
    ]
}

リクエストを送る場合には、pageパラメータを加えると指定の結果が得られます。

この記事と関連している記事