ลิงก์ Laravel Pagination ไม่รวมพารามิเตอร์ GET อื่น ๆ


110

ฉันใช้ Eloquent ร่วมกับคลาส Pagination ของ Laravel 4

ปัญหา:เมื่อมีพารามิเตอร์ GET บางตัวใน URL เช่น: http://site.com/users?gender=female&body=hotลิงก์การแบ่งหน้าที่สร้างขึ้นมีเพียงpageพารามิเตอร์เท่านั้นและไม่มีอะไรอื่น

แม่แบบใบมีด

{{ $users->link() }}

มี->append()ฟังก์ชั่นสำหรับสิ่งนี้ แต่เมื่อเราไม่รู้ว่ามีพารามิเตอร์ GET อยู่กี่ตัวเราจะใช้append()พารามิเตอร์ GET อื่น ๆ ในลิงก์ที่แบ่งหน้าได้อย่างไรโดยไม่ต้องมีifโค้ดทั้งหมดที่ทำให้เทมเพลตเบลดของเรายุ่งเหยิง

คำตอบ:


127

แก้ไข: ความคิดเห็นของ Connor พร้อมคำตอบของ Mehdi เป็นสิ่งจำเป็นในการทำงานนี้ ขอบคุณทั้งสองสำหรับคำชี้แจง

->appends()สามารถยอมรับอาร์เรย์เป็นพารามิเตอร์คุณสามารถส่งผ่านInput::except('page')ซึ่งควรทำเคล็ดลับ

ตัวอย่าง:

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

37
เพียงเพื่อทราบสำหรับชาว Google อื่น ๆ มาทางนี้ - ก็ตอนนี้พหูพจน์appends, ไม่ appendการต่อโซ่ที่ถูกต้องจะเป็นเช่น$query->appends($foo)->links();
Connor Peet

6
ฉันพบว่า$query->appends(Input::except('page'))->links();ทำงานได้ดีขึ้น มิฉะนั้นตัวแปรของหน้าจะไม่อัปเดตเมื่อคุณคลิกหน้า ลาราเวล 4.1.24.
bitlather

... จากนั้นฉันก็เลื่อนลงเพื่อดูวิธีแก้ปัญหาของ Mehdi
bitlather

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

2
ใน laravel 5.2 คุณควรใช้ Request แทน Input
Christophvh

107

ฉันคิดว่าคุณควรใช้รหัสนี้ใน Laravel 5 นอกจากนี้ยังใช้งานได้กับพารามิเตอร์pageเท่านั้น แต่ยังใช้กับพารามิเตอร์อื่น ๆ ด้วย:

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

โดยส่วนตัวฉันพยายามหลีกเลี่ยงการใช้Facadesเท่าที่จะทำได้ การใช้ฟังก์ชั่นตัวช่วยระดับโลกนั้นใช้รหัสน้อยกว่าและสวยงามมาก

อัพเดท:

อย่าใช้InputFacade เนื่องจากเลิกใช้แล้วใน Laravel v6 +


2
สิ่งนี้ใช้ได้กับ laravel 5.6 การใช้โซลูชันคำตอบที่ยอมรับทำให้เกิดข้อผิดพลาดสำหรับฉัน
Muhmmad Aziz

1
ฉันยังดำเนินการนี้สำเร็จในโครงการ 5.3; ฉันชอบวิธีง่ายๆนี้เช่นกัน
kjones

3
นอกจากนี้ฉันสังเกตเห็นว่าคุณไม่จำเป็นต้องใช้except('page')กับโซลูชันนี้
BakerStreetSystems

1
เป็นประโยชน์มาก ขอบคุณ
Viraj Amarasinghe

แต่ตัวช่วยระดับโลกอะไรที่ทำหน้าที่ แต่สิ่งที่คุณพยายามหลีกเลี่ยง ..
KorbenDallas

42

คุณสามารถใช้

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

ตัวอย่างใน Controller:

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

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

ตัวอย่างในมุมมอง:

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

3
นี่เป็นวิธีที่ Mohamed Said (พนักงานของ Laravel) แนะนำดู: github.com/laravel/framework/issues/…
รอย

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะสิ่งที่ @roy พูด + ตัวอย่างที่ดีกว่า นอกจากนี้ยังมีในตัวอย่าง Controller + ดูตัวอย่าง
Maky

2
ทำงานให้ฉัน +1
Manoj Kumar

1
นี่เป็นทางออกที่ดีที่สุดซึ่งใช้ได้ผลกับฉันเช่นกัน
Jithin

40

จะตระหนักถึงของInput::all()มันจะรวมถึงก่อนหน้านี้?page=ค่าอีกครั้งและอีกครั้งในแต่ละหน้าคุณเปิด!
ตัวอย่างเช่นหากคุณอยู่ใน?page=1และคุณเปิดหน้าถัดไปมันจะเปิดขึ้น?page=1&page=2
ดังนั้นหน้าค่าสุดท้ายจะเป็นหน้าที่คุณเห็น! ไม่ใช่หน้าที่คุณต้องการดู

วิธีแก้ไข: ใช้ Input::except(array('page'))




6

Laravel 7.x ได้เพิ่มวิธีการใหม่ให้กับ paginator:

->withQueryString()

คุณสามารถใช้มันได้เช่น:

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

สำหรับ laravel ต่ำกว่า 7.x ใช้:

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

ว้าวมันน่าทึ่งเพียงแค่บรรทัดเดียว ฉันพลาดเอกสาร แม้ว่า 7.x คือความรัก
MR_AMDEV

คุณมี 2 แนวทางโปรดแยกความแตกต่างและให้ข้อมูลว่าวิธีใดดีกว่าและมีประโยชน์มากกว่า
MR_AMDEV

คำตอบที่ดีที่สุด ฉันจะให้ 2 โหวตถ้าทำได้ :)
iWizard

1
@MR_AMDEV หลังฝากระโปรงทั้งคู่เหมือนกัน Laravel เพิ่งนำมาใช้กับเวอร์ชันล่าสุด
Rikesh Shrestha

5

ใช้โครงสร้างนี้เพื่อเก็บพารามิเตอร์อินพุตทั้งหมดยกเว้นหน้า

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

ทำไม?

1) คุณตัดทุกอย่างที่เพิ่มเข้ามาในคำขอเช่นนั้น

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

2) คุณไม่ต้องการ $ request เป็นพารามิเตอร์อินพุตสำหรับฟังก์ชัน

3) คุณไม่รวม "เพจ"

PS) และใช้ได้กับ Laravel 5.1



4

สำหรับใครใน laravel 5 ขึ้นไปใน Blade:

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

คุณสามารถรับไอเทมที่ผ่านมาได้ด้วย

$passed_item=$request->id;

ทดสอบด้วย

dd($passed_item);

คุณต้องได้รับมูลค่า $ บางอย่าง


0

ป้อนหมายเลขหน้าสำหรับการแบ่งหน้าด้วย บางสิ่งเช่นนี้

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.