🦀

laravel6.2¦一画面に複数ページネーションがある時、独立した動作にする

2020/10/15に公開

やりたいこと

予約一覧、振り込み履歴一覧…など各一覧が一気に表示されるページのとき、それぞれの一覧にページネーションをつけても1つを押すと画面にあるページネーションすべてが動作してしまいます。これを別々に動作するように修正していきます。

環境

・laravel 6.2
・php 7.2

Laravel5で1ページに複数のPaginationを実装するを参考にさせていただきました!

ページネーションの種類

laravelには2つ種類があります。
💡paginate
Illuminate\Pagination\LengthAwarePaginatorインスタンスを呼び出す。
結果セット内のアイテムの総数をカウントするので、ページの数を記憶でき最後のページのインデックスを取得することができるようです。

💡simplePaginate
Illuminate\Pagination\Paginatorインスタンスを呼び出す。
最後のページのインデックスを取得するためのメソッドがないのでシンプルな実装になり「前へ」「次へ」のみの表示になるようです。

今回はpaginateを使用していきます👌

コントローラーの実装

普段通りコントローラーからmodelクラスを呼んで、変数につめてbladeに渡していきます。

public function show(User $user, $userId)
{
    $userProfile = $user->getUserProfile($userId);
    // $reservationsと$transferHistoriesにページネーションつけたい
    $reservations = $user->getUserReservations($userId);
    $transferHistories = $user->getUserTransferHistories($userId);

    return view('user.show', compact('userProfile', 'reservations', 'transferHistories'));
}

ページネーションの実装

モデルクラスにpaginateを設定して意図した動作になるように実装していきます。
paginateメソッドのパラメーターは↓のようになっていました。

// Illuminate/Database/Query/Builder.php
public function paginate($perPage = 15, $columns = ['*'], $pageName = 'page', $page = null)

・paginateメソッドの3番目の引数がパスに表示される名称になり、未指定の場合はpageになる
$pageNameが未指定で1画面に複数のページネーションがある場合、どのページネーションを押してもpageになるため、どのページネーションを押したのか判断できない

今回は$pageNametransferPagereservePageに指定していきます💫

$reservationsへpageNameを設定

public function getUserReservations(int $userId)
{
    return $this-> // ・・・いろいろな処理・・・
                ->paginate(config('const.ReservationsPaginate'), ['*'], 'reservePage')
                ->appends(['transferPage' => \Request::get('transferPage')]);
}

$transferHistoriesへpageNameを設定

public function getUserTransferHistories(int $userId)
{
    return $this-> // ・・・いろいろな処理・・・
                ->paginate(config('const.UserTransferHistoriesPaginate'), ['*'], 'transferPage')
                ->appends(['reservePage' => \Request::get('reservePage')]);
}

blade側はいつも通りlinksを実装することで完成できました◎

{{ $reservations->links() }}
appendsについて

ページネーションにパラメータを追加するのにクエリビルダで

->appends(['reservePage' => \Request::get('reservePage')]);

としているのですが、Appending To Pagination Linksのことのようでクエリビルダで設定せずに、bladeファイルで設定しても同じ動作になりました。

{{ $transferHistories->appends(['reservePage' => \Request::get('reservePage')])->links() }}

🎩🎩🎩

そもそもデザイン的にあまりないのかもしれないのですが…ページネーションに詳しくなったのと、意図した動作になったので良かったです( '֊' )

Discussion