Laravel - ページングを実装するためLengthAwarePaginatorを使ってみた

Laravelでページングを実装するには、主に

  1. DB(Eloquent、クエリビルダ)のpaginateを使う
  2. Paginatorクラスを使う
  3. LengthAwarePaginatorクラスを使う

の3種類の方法があります。

1つのテーブルから取ってきたデータを表示する場合は、1が簡単でオススメですが、複数のテーブルにまたがったりして1の方法が使えない時に2,3の方法が使えます。

今回、3のLengthAwarePaginatorを使ったやり方を試してみたので同じことをしようとしている人の参考になればと思い、記事を書こうと思いました。
先に作ったコードを示します。

testController.php
public function makePagination(Request $request, array $result, int $perPage)
    {
        $displayData = array_chunk($result, $perPage);
        $currentPageNo = $request->input('page', 1);

        $pagination = new LengthAwarePaginator(
            $displayData[$currentPageNo - 1],
            count($result),
            $perPage,
            $currentPageNo,
            array('path' => $request->url())
        );

        return $pagination;
    }

本来はコントローラにあまりルーティングに関係ない処理を書かない方がいいようなのですが、Requestを使った方が簡単に書けると思い、コントローラに書いてしまいました。 理想的な実装箇所等ありましたらコメントいただけると幸いです。

本題に戻りますが、このメソッドは、

  • リクエストデータ
  • ページネーションを作成したいデータの配列
  • 1ページに表示したい数

を引数にとり、LengthAwarePaginatorのインスタンス(ページネーションのデータ)を返します。

中で行なっていることは、

  1. 1ページに表示したい数に合わせて配列を分割
  2. 現在のページを取得
  3. ページネーションを作成
    • 引数
      • 該当ページに表示するデータ
      • 全件数
      • 1ページに表示する数
      • 現在のページ番号
      • オプション

見たままですがこんな感じです。

ちなみにview側では、このように使います。

{{ $result->links() }}

検索条件等を保持しておきたい場合は、

{{ $result->appends($searchConditions)->links() }}

このようにすることでページネーターにデータを渡すことができます。

この記事は以上です。
最後までお読みいただきありがとうございます。
この記事が誰かの参考になることを心から願っています。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.