Tautan Laravel Pagination tidak termasuk parameter GET lainnya


102

Saya menggunakan Eloquent bersama dengan kelas Pagination Laravel 4.

Masalah: Ketika ada beberapa parameter GET di URL, misalnya http://site.com/users?gender=female&body=hot:, link pagination yang dihasilkan hanya berisi pageparameter tersebut dan tidak ada yang lain.

Template Pisau

{{ $users->link() }}

Ada ->append()fungsi untuk ini, tetapi ketika kita tidak tahu berapa banyak parameter GET yang ada, bagaimana kita dapat menggunakan append()untuk menyertakan parameter GET lainnya di tautan paginasi tanpa seluruh potongan ifkode yang mengacaukan template blade kita?

Jawaban:


121

EDIT: Komentar Connor dengan jawaban Mehdi diperlukan untuk membuat ini berfungsi. Terima kasih untuk keduanya atas klarifikasi mereka.

->appends() dapat menerima array sebagai parameter, Anda bisa lewat Input::except('page') , yang seharusnya melakukan trik.

Contoh:

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

37
Sekadar diperhatikan untuk Googler lain yang datang dengan cara ini - sekarang jamak appends, bukan append . Rangkaian yang benar akan menjadi seperti$query->appends($foo)->links();
Connor Peet

6
Saya menemukan $query->appends(Input::except('page'))->links();bekerja lebih baik. Jika tidak, variabel halaman tidak diperbarui saat Anda mengklik halaman. Laravel 4.1.24.
bitlather

... dan kemudian saya menggulir ke bawah untuk melihat solusi Mehdi.
bitlather

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

2
Di laravel 5.2 Anda harus menggunakan Request alih-alih Input
Christophvh

104

Saya pikir Anda harus menggunakan kode ini di Laravel 5. Ini juga akan bekerja tidak hanya dengan parameter pagetetapi juga dengan parameter lain:

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

Secara pribadi, saya mencoba menghindari penggunaan Facadessebanyak yang saya bisa. Menggunakan fungsi pembantu global lebih sedikit kode dan lebih elegan.

MEMPERBARUI:

Jangan gunakan InputFacade karena sudah tidak digunakan lagi di Laravel v6 +


2
Ini berfungsi untuk laravel 5.6, menggunakan solusi jawaban yang diterima menyebabkan kesalahan bagi saya.
Muhmmad Aziz

1
Saya juga berhasil mengimplementasikannya pada proyek 5.3; Saya lebih suka metode sederhana ini juga
kjones

3
Juga, saya perhatikan bahwa Anda tidak perlu menggunakan except('page')solusi ini.
BakerStreetSystems

1
Sangat membantu. Terima kasih
Viraj Amarasinghe

40

Sadarilah dari Input::all(), itu akan Sertakan sebelumnya ?page=nilai lagi dan lagi di setiap halaman Anda membuka!
misalnya jika Anda masuk ?page=1dan Anda membuka halaman berikutnya, itu akan terbuka ?page=1&page=2
Jadi halaman nilai terakhir yang diambil adalah halaman yang Anda lihat! bukan halaman yang ingin Anda lihat

Solusi: gunakan Input::except(array('page'))


39

Anda bisa menggunakan

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

Contoh di Controller:

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

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

Contoh di View:

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

3
Ini adalah cara yang disarankan oleh Mohamed Said (karyawan Laravel), lihat: github.com/laravel/framework/issues/…
Roy

1
Saya pikir ini adalah jawaban terbaik karena apa yang dikatakan @roy + contoh yang lebih baik. Juga memiliki dalam contoh Controller + Contoh tampilan.
Maky

2
Bekerja untuk saya. +1
Manoj Kumar

1
Ini adalah solusi terbaik, ini juga berhasil untuk saya
Jithin

28

Bukan append()Tapi appends() Jadi, jawaban yang benar adalah:

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

11

LARAVEL 5

Tampilan harus berisi sesuatu seperti:

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


5

Gunakan konstruksi ini, untuk menyimpan semua input params kecuali halaman

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

Mengapa?

1) Anda menghapus semua yang ditambahkan ke permintaan seperti itu

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

2) Anda tidak perlu $ request sebagai parameter input untuk fungsi tersebut

3) Anda mengecualikan "halaman"

PS) dan berfungsi untuk Laravel 5.1


4

Sertakan Ini Di Halaman Tampilan Anda

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

4

untuk yang di laravel 5 atau lebih di bilah:

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

Anda bisa mendapatkan item yang lulus dengan

$passed_item=$request->id;

mengujinya dengan

dd($passed_item);

Anda harus mendapatkan nilai $ sesuatu


1

Laravel 7.x telah menambahkan metode baru ke paginator:

->withQueryString()

Jadi Anda bisa menggunakannya seperti:

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

Untuk laravel di bawah 7.x gunakan:

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

0

Berikan juga nomor halaman untuk penomoran halaman. Sesuatu seperti ini

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.