ChatGPT解决这个技术问题 Extra ChatGPT

Laravel Pagination links not including other GET parameters

I am using Eloquent together with Laravel 4's Pagination class.

Problem: When there are some GET parameters in the URL, eg: http://site.example/users?gender=female&body=hot, the pagination links produced only contain the page parameter and nothing else.

Blade Template

{{ $users->link() }}

There's a ->append() function for this, but when we don't know how many of the GET parameters are there, how can we use append() to include the other GET parameters in the paginated links without a whole chunk of if code messing up our blade template?

you can simply do: {{ $users->withQueryString()->links() }} in laravel version 7 and above

L
Limon Monte

EDIT: Connor's comment with Mehdi's answer are required to make this work. Thanks to both for their clarifications.

->appends() can accept an array as a parameter, you could pass Input::except('page'), that should do the trick.

Example:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);

Just to note for other Googlers coming this way - it's now plural appends, not append. The correct chaining would be something like $query->appends($foo)->links();
I found $query->appends(Input::except('page'))->links(); worked better. Otherwise, the page variable did not update when you clicked a page. Laravel 4.1.24.
...and then I scrolled down to see Mehdi's solution.
LARAVEL 5: {!! $myItems->appends(Input::except('page'))->render() !!}
In laravel 5.2 you should use Request instead of Input
A
Amir Hassan Azimi

I think you should use this code in Laravel version 5+. Also this will work not only with parameter page but also with any other parameter(s):

$users->appends(request()->input())->links();

Personally, I try to avoid using Facades as much as I can. Using global helper functions is less code and much elegant.

UPDATE:

Do not use Input Facade as it is deprecated in Laravel v6+


This worked for laravel 5.6, using the accepted answer solution caused an error for me.
I also implemented this successfully on a 5.3 project; I prefer this simple method as well
Also, I've noticed that you don't need to use except('page') with this solution.
But what global helper functions but a facades you are trying to avoid?..
This worked in laravel 8, more useful and simple solution.
A
AKOP

You could use

->appends(request()->query())

Example in the Controller:

$users = User::search()->order()->with('type:id,name')
    ->paginate(30)
    ->appends(request()->query());

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

Example in the View:

{{ $users->appends(request()->query())->links() }}

This is the suggested way by Mohamed Said (Laravel employee), see: github.com/laravel/framework/issues/…
M
Mehdi Maghrouni

Be aware of the Input::all() , it will Include the previous ?page= values again and again in each page you open !
for example if you are in ?page=1 and you open the next page, it will open ?page=1&page=2
So the last value page takes will be the page you see ! not the page you want to see

Solution : use Input::except(array('page'))


S
Shrestharikesh

Laravel 7.x and above has added new method to paginator:

->withQueryString()

So you can use it like:

{{ $users->withQueryString()->links() }}

For laravel below 7.x use:

{{ $users->appends(request()->query())->links() }}

Wow its amazing just a single line. I missed the docs. Although 7.x is love
you provide 2 approaches .Please differentiate them and provide info which one is better and more useful
@MR_AMDEV behind the hood both are same. Laravel just adopted it on its latest version.
@RikeshShrestha Is there a way to urlencode the query parameters with that?
if you have a blank parameter value also use if (isset($_GET['search_text'])) { $search_text = $_GET['search_text']; } else { $search_text = ""; }
B
Bald

Not append() but appends() So, right answer is:

{!! $records->appends(Input::except('page'))->links() !!}

e
ecairol

LARAVEL 5

The view must contain something like:

{!! $myItems->appends(Input::except('page'))->render() !!}


Y
Yevgeniy Afanasyev

Use this construction, to keep all input params but page

{!! $myItems->appends(Request::capture()->except('page'))->render() !!}

Why?

1) you strip down everything that added to request like that

  $request->request->add(['variable' => 123]);

2) you don't need $request as input parameter for the function

3) you are excluding "page"

PS) and it works for Laravel 5.1


S
Siva Ganesh

Include This In Your View Page

 $users->appends(Input::except('page'))

M
Mostafa Asadi

for who one in laravel 5 or greater in blade:

{{ $table->appends(['id' => $something ])->links() }}

you can get the passed item with

$passed_item=$request->id;

test it with

dd($passed_item);

you must get $something value


M
Mostafa Norzade

In Laravel 7.x you can use it like this:

{{ $results->withQueryString()->links() }}

C
Cengkuru Michael

Pass the page number for pagination as well. Some thing like this

$currentPg = Input::get('page') ? Input::get('page') : '1'; $boards = Cache::remember('boards'.$currentPg, 60, function(){ return WhatEverModel::paginate(15); });


M
Miraj Khandaker

In Your controller after pagination add withQueryString() like below

$post = Post::paginate(10)->withQueryString();

M
Max Stevens

Many solution here mention using Input...

Input has been removed in Laravel 6, 7, 8

Use Request instead.

Here's the blade statement that worked in my Laravel 8 project:

{{$data->appends(Request::except('page'))->links()}}

Where $data is the PHP object containing the paginated data.

Thanks to Alexandre Danault who pointed this out in this comment.


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now