27
25

More than 5 years have passed since last update.

Laravel5で1ページに複数のPaginationを実装する

Last updated at Posted at 2018-02-16

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というリクエストとなります。
それぞれの一覧が独立してページ移動できるようになります。

27
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25