Liên kết phân trang Laravel không bao gồm các tham số GET khác


102

Tôi đang sử dụng Eloquent cùng với lớp Pagination của Laravel 4.

Vấn đề: Khi có một số tham số GET trong URL, ví dụ http://site.com/users?gender=female&body=hot:, các liên kết phân trang được tạo ra chỉ chứa pagetham số và không có gì khác.

Mẫu lưỡi

{{ $users->link() }}

Có một ->append()chức năng cho việc này, nhưng khi chúng ta không biết có bao nhiêu tham số GET, làm thế nào chúng ta có thể sử dụng append()để bao gồm các tham số GET khác trong các liên kết được phân trang mà không cần toàn bộ đoạn ifmã làm rối mẫu phiến của chúng ta?

Câu trả lời:


121

CHỈNH SỬA: Nhận xét của Connor với câu trả lời của Mehdi được yêu cầu để làm cho công việc này. Cảm ơn cả hai đã làm rõ.

->appends()có thể chấp nhận một mảng như một tham số, bạn có thể vượt qua Input::except('page'), điều đó sẽ thực hiện thủ thuật.

Thí dụ:

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

37
Chỉ cần lưu ý cho những người Google khác đến theo cách này - bây giờ nó là số nhiều appends, không phải append . Các chaining đúng sẽ là một cái gì đó giống như$query->appends($foo)->links();
Connor Peet

6
Tôi thấy $query->appends(Input::except('page'))->links();làm việc tốt hơn. Nếu không, biến trang không cập nhật khi bạn nhấp vào một trang. Laravel 4.1.24.
bitlather

... và sau đó tôi cuộn xuống để xem giải pháp của Mehdi.
bitlather

2
LARAVEL 5: {!! $myItems->appends(Input::except('page'))->render() !!}
ecairol.

2
Trong laravel 5.2 bạn nên sử dụng Yêu cầu thay vì Input
Christophvh

104

Tôi nghĩ bạn nên sử dụng mã này trong Laravel 5. Ngoài ra, mã này sẽ hoạt động không chỉ với tham số pagemà còn với bất kỳ (các) tham số nào khác:

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

Cá nhân tôi cố gắng tránh sử dụng Facadescàng nhiều càng tốt. Sử dụng các hàm trợ giúp toàn cục ít mã hơn và thanh lịch hơn nhiều.

CẬP NHẬT:

Không sử dụng InputFacade vì nó không được dùng trong Laravel v6 +


2
Điều này đã làm việc cho laravel 5.6, sử dụng giải pháp câu trả lời được chấp nhận đã gây ra lỗi cho tôi.
Muhmmad Aziz

1
Tôi cũng đã thực hiện điều này thành công trên một dự án 5.3; Tôi cũng thích phương pháp đơn giản này hơn
kjones 14/09/18

3
Ngoài ra, tôi nhận thấy rằng bạn không cần sử dụng except('page')với giải pháp này.
BakerStreetSystems

1
Rất hữu ích. Cảm ơn
Viraj Amarasinghe

40

Hãy nhận biết của Input::all(), nó sẽ bao gồm các trước ?page=giá trị một lần nữa và một lần nữa trong mỗi trang bạn mở!
Ví dụ: nếu bạn đang ở trong ?page=1và bạn mở trang tiếp theo, nó sẽ mở ?page=1&page=2
Vì vậy, trang giá trị cuối cùng sẽ là trang bạn thấy! không phải trang bạn muốn xem

Giải pháp: sử dụng Input::except(array('page'))


39

Bạn đã có thể sử dụng

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

Ví dụ trong Bộ điều khiển:

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

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

Ví dụ trong Chế độ xem:

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

3
Đây là cách được gợi ý bởi Mohamed Said (nhân viên Laravel), xem tại: github.com/laravel/framework/issues/…
Roy

1
Tôi nghĩ đây là câu trả lời tốt nhất vì những gì @roy đã nói + ví dụ hay hơn. Ngoài ra, nó có ví dụ trong Controller example + View.
Maky

2
Đã làm cho tôi. +1
Manoj Kumar

1
Đây là giải pháp tốt nhất, điều này đã làm việc cho tôi là tốt
Jithin

28

Không phải append()nhưng appends() Vì vậy, câu trả lời đúng là:

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

11

LARAVEL 5

Chế độ xem phải chứa một cái gì đó như:

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


5

Sử dụng cấu trúc này, để giữ tất cả các thông số đầu vào trừ trang

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

Tại sao?

1) bạn loại bỏ mọi thứ đã thêm vào để yêu cầu như vậy

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

2) bạn không cần $ request làm tham số đầu vào cho hàm

3) bạn đang loại trừ "trang"

PS) và nó hoạt động cho Laravel 5.1


4

Bao gồm điều này trong trang xem của bạn

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

4

cho ai trong laravel 5 trở lên trong blade:

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

bạn có thể lấy vật phẩm đã qua với

$passed_item=$request->id;

kiểm tra nó với

dd($passed_item);

bạn phải nhận được giá trị $ gì đó


1

Laravel 7.x đã thêm phương thức mới vào paginator:

->withQueryString()

Vì vậy, bạn có thể sử dụng nó như:

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

Đối với laravel dưới 7.x sử dụng:

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

0

Vượt qua số trang để phân trang. Một số điều như thế này

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.