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?

Nyxynyx
sumber

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'))
]);
Alexandre Danault
sumber
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 +

Hassan Azimi
sumber
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'))

Mehdi Maghrouni
sumber
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() }}
Aleksandr Kopelevich
sumber
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() !!}
Botak
sumber
11

LARAVEL 5

Tampilan harus berisi sesuatu seperti:

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

ecairol
sumber
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

Yevgeniy Afanasyev
sumber
4

Sertakan Ini Di Halaman Tampilan Anda

 $users->appends(Input::except('page'))
Siva Ganesh
sumber
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

Mostafa Asadi
sumber
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() }}
Rikesh Shrestha
sumber
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); });

Cengkuru Michael
sumber