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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。