LaravelのPagination機能を同じ画面で複数使用すると、複数のテーブルで同時にページ移動してしまいます。
public function index()
{
$users = DB::table('users')->paginate(5);
$items = DB::table('items')->paginate(5);
return view('user/index'), ['users', 'items']);
}
ページ移動時にuser/index?page=2
というリクエストが送られて、どちらの一覧もpageパラメータを参照するためです。
Paginationのパラメータ名を変更する
paginateメソッドの引数にパラメータ名を指定することができます。
public function index()
{
// ユーザー一覧のページ番号をuserpageというパラメータ名に変更
$users = DB::table('users')->paginate(5, ["*"], 'userpage');
// アイテム一覧のページ番号をitempageというパラメータ名に変更
$items = DB::table('items')->paginate(5, ["*"], 'itempage');
return view('user/index'), ['users', 'items']);
}
参考
https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Builder.html#method_paginate
これでuser/index?userpage=2
または、user/index?itempage=2
というリクエストとなります。
それぞれの一覧は異なるパラメータを参照するので、同時にページ移動することはありません。
しかし、片方がページ移動をするともう片方は1ページ目に戻ってしまいます。
ページ移動時のリクエストからもう片方のページパラメータが消えてしまうためです。
Paginationにパラメータを追加する
ページ移動時にもう片方のページパラメータを追加できれば解決します。
追加するにはappendsメソッドを使用します。
public function index()
{
// ユーザーPaginationにitempageのパラメータを追加する
$users = DB::table('users')->paginate(5, ["*"], 'userpage')
->appends(["itempage" => Input::get('itempage')]);
// アイテムPaginationにuserpageのパラメータを追加する
$items = DB::table('items')->paginate(5, ["*"], 'itempage')
->appends(["userpage" => Input::get('userpage')]);
return view('user/index'), ['users', 'items']);
}
これでuser/index?userpage=2&itempage=3
というリクエストとなります。
それぞれの一覧が独立してページ移動できるようになります。