30

Been working on this for far too long with no results. I have tried.

`\Illuminate\Pagination\Paginator::setCurrentPage($current_page);`

returns Call to protected method Illuminate\Pagination\Paginator::setCurrentPage()

\Paginator::setCurrentPage($current_page);

returns Call to protected method Illuminate\Pagination\Paginator::setCurrentPage()

\DB::getPaginator()->setCurrentPage($current_page);

returns call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\MySqlConnection' does not have a method 'getPaginator'

$tmp = new Post( ); $tmp->getConnection()->setCurrentPage($current_page);

returns call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\MySqlConnection' does not have a method 'getPaginator'

How can I specify the page? I need to specify it manually.

I had hoped it to be as easy as $model->find( )->paginate($per_page, $page)

Shane
  • 2,375
  • 4
  • 22
  • 31

4 Answers4

83

The Builder Class has:

public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)

You can call

Model::find(...)->paginate($per_page, ['*'], 'page', $page);
m00am
  • 5,910
  • 11
  • 53
  • 69
PATROMO
  • 1,112
  • 8
  • 11
51

Suppose you have $users to paginate in your UserController, you might do:

public function index()
{
    $currentPage = 3; // You can set this to any page you want to paginate to

    // Make sure that you call the static method currentPageResolver()
    // before querying users
    Paginator::currentPageResolver(function () use ($currentPage) {
        return $currentPage;
    });

    $users = \App\User::paginate(5);

    return view('user.index', compact('users'));
}

I believe this applies to Laravel 5.0 and above. Have to check on that.

amith.gotamey
  • 968
  • 8
  • 14
  • 5
    I had to run it with `\Illuminate\Pagination\Paginator::currentPageResolver` else it searched for the class in the current name space. With `\Paginator' it told me the class was not found. This way it works! – Shane Aug 06 '15 at 11:13
  • 5
    Shane, you could have `imported` the class at the top of your controller: `use Illuminate\Pagination\Paginator;` – amith.gotamey Aug 08 '15 at 05:10
  • Perfect. Thank you. – Iftakharul Alam Jul 11 '16 at 06:35
  • Your code should be added an if condition to check if user is going to other page, or it will stuck on a same page. – Kelvin Low Oct 30 '17 at 03:19
  • 1
    While this may work, Ive downvoted because this goes way around simply passing the parameter that already exists in the method signature. – Wesley Smith Jul 02 '20 at 05:57
  • Is there a method which determine how to create pagination links? There must be something what take current request and append page param to there. But I would like to change this proces by route name. – Čamo Feb 16 '21 at 15:02
1

After 7 years) in Laravel 8 I wanted to show the last page if the page from the parameter is bigger than the total pages the after search result. Below is my solution.

$paginator = $properties->paginate($items_per_page);

if ($paginator->currentPage() > 1 && $paginator->isEmpty()) {
    $paginator = $properties->paginate($items_per_page, ['*'], 'page', $paginator->lastPage());
}
-1

for those people who using api and they want to specify the current page in api, they can use extra parameter like this:

getProducts?page=3

Ahmad.Net
  • 581
  • 5
  • 8
  • It really depends on how your routes are structured and how you are using the framework. The paginator uses "first_page_url": "/?page=1" as default but if you are not using this structure then it won't work. – Rodrigo Almeida Feb 04 '21 at 17:32