複数のページネーションを実装したい場合のテクニック

Laravel のページネーション機能を同じ画面で複数使用すると、複数のテーブルで同時にページ移動してしまいます。

例えば、以下のような実装コードになります。

 

コントローラ

public function index()
{
   $users = DB::table('users')->paginate(5);
   $items = DB::table('items')->paginate(5);

   $hash = array(
         'users' => $users
         'items' => $items
   );

   return view('user/index')->with($hash);
}

 

この理由は、ページ移動に user/index?page=2 というリクエストが送られて、どちらの一覧も page パラメータを参照するためです。

これを回避するためにはどうすればいいでしょうか?

以下のように、ページネーションのパラメータ名をそれぞれ変更してあげるといいです。

 

コントローラ

public function index()
{
   $users = DB::table('users')->paginate(5, ["*"], 'user-page');
   $items = DB::table('items')->paginate(5, ["*"], 'item-page');

   $hash = array(
         'users' => $users
         'items' => $items
   );

   return view('user/index')->with($hash);
}

 

これで user/index?user-page=2 もう片方は user/index?item-page=2 というリクエストとなります。

それぞれの一覧は異なるパラメータを参照するので、同時にページ移動することはありません。

しかし、ここでまた問題が一つ発生します。

片方がページ移動をするともう片方は1ページ目に戻ってしまいます。

ページ移動時のリクエストから、もう片方のページパラメータが消えてしまうためです。

これを解決するためにページネーションにもう片方のパラメータを追加してあげます。

追加するにはappendsメソッドを使用します。

最終的な実装コードは以下になります。

 

コントローラ

public function index(Request $request)
{
   $users = DB::table('users')->paginate(5, ["*"], 'user-page')
                         ->appends(["item-page" => $request->input('item-page')]);

   $items = DB::table('items')->paginate(5, ["*"], 'item-page')
                        ->appends(["user-page" => $request::input('user-page')]);

   $hash = array(
         'users' => $users
         'items' => $items
   );

   return view('user/index')->with($hash);
}

 

上記のコードを実装すると user/index?user-page=2&item-page=3 というリクエストとなります。

これで、それぞれの一覧が独立してページ移動できるようになります。

 
以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識