Laravel Eloquent: ผลลัพธ์การสั่งซื้อทั้งหมด ()


214

ฉันติดอยู่กับงานง่าย ๆ ฉันแค่ต้องการสั่งซื้อผลลัพธ์ที่มาจากการโทรนี้

$results = Project::all();

Projectโมเดลอยู่ที่ไหน ฉันได้ลองแล้ว

$results = Project::all()->orderBy("name");

แต่มันไม่ทำงาน วิธีใดที่ดีกว่าในการรับข้อมูลทั้งหมดจากตารางและสั่งซื้อได้

คำตอบ:


384

คุณสามารถทำได้จริงในแบบสอบถาม

$results = Project::orderBy('name')->get();

การดำเนินการนี้จะส่งคืนผลลัพธ์ทั้งหมดตามลำดับที่เหมาะสม


นี่คือเอกสาร: laravel.com/docs/5.7/eloquent#retrieving-models
Ryan

และคำอธิบายสำหรับget()vs all(): stackoverflow.com/questions/34587457/…
patricus

114

คุณยังคงสามารถใช้ sortBy (ที่ระดับคอลเลกชัน) แทน orderBy (ที่ระดับแบบสอบถาม) หากคุณยังต้องการใช้ทั้งหมด () เนื่องจากมันส่งคืนชุดของวัตถุ

เรียงลำดับขึ้น

$results = Project::all()->sortBy("name");

คำสั่งซื้อมากไปน้อย

$results = Project::all()->sortByDesc("name");

ตรวจสอบเอกสารเกี่ยวกับการรวบรวมเพื่อดูรายละเอียดเพิ่มเติม

https://laravel.com/docs/5.1/collections


สิ่งที่ฉันกำลังมองหา การใช้สิ่งนี้อย่างกว้างขวางจะมีข้อเสียใด ๆ เมื่อเทียบกับการใช้orderByที่ระดับแบบสอบถามหรือไม่
Giedrius

1
\ @foreach ($ posts-> sortByDesc ('created_at') เป็น $ post) \ @ รวม ('posts.post') \ @endforeach
sdexp

2
ฉันสนใจที่จะรู้ว่าสิ่งนี้ทำงานอย่างไรเบื้องหลัง มันทำให้ฉันรู้สึกประหนึ่งว่าการเรียงลำดับคอลเลกชันsortBy()เกิดขึ้นภายใน Laravel Engine (ใน PHP) ในขณะที่orderBy()ทำในฐานข้อมูล แน่นอนฐานข้อมูลจะเร็วขึ้นในเกือบทุกสถานการณ์ที่เป็นไปได้และเมื่อชุดข้อมูลของคุณเพิ่มขึ้นความไม่เท่าเทียมกันในประสิทธิภาพก็จะเพิ่มขึ้นเช่นกัน ฉันชอบที่จะได้ยินความคิดของคนอื่นเกี่ยวกับเรื่องนี้
cartbeforehorse

3
@cartbeforehorse คุณจำเป็นต้องรู้ว่าเมธอดส่งคืนอะไร :: all () อาจจะแค่เรียก -> get () ภายใต้ประทุนซึ่งในทางกลับกันจะส่งกลับคอลเลกชัน sortBy () เป็นวิธีการรวบรวมดังนั้นใช่มันเกิดขึ้นในด้าน PHP (ตรงข้ามกับ orderBy () ซึ่งเรียกว่าในวัตถุแบบสอบถาม) มันเป็นความคิดที่ดีที่จะใช้ :: all () เลยให้เรียงลำดับใน PHP ลองจินตนาการดูว่า :: :: ทั้งหมด () ส่งคืนคอลเล็กชันที่มีวัตถุนับล้านรายการ ใช้เวลาในการดึงข้อมูลนานเกินไปและใช้เวลาในการจัดเรียงใน PHP มากขึ้น แน่นอนคุณสามารถใช้ :: all () ถ้าคุณรู้ว่ามันจะกลับมาเพียงแค่หยิบวัตถุ (ในชุด)
Avram

ทำไมคนนี้ถึงไม่ตอบรับ? มันใช้งานได้กับฟังก์ชั่น all ()
VishalParkash

36

นอกจากนี้เพื่อเพียงแค่ค้ำยันคำตอบเดิมก็สามารถเรียงได้เช่นกันทั้งในคำสั่งdescจากมากไปน้อยหรือน้อยไปมากascโดยการเพิ่มเป็นพารามิเตอร์ตัวที่สอง

$results = Project::orderBy('created_at', 'desc')->get();


10

ในขณะที่คุณต้องการผลลัพธ์สำหรับวันที่ตามมา

$results = Project::latest('created_at')->get();

9

ทำเช่นนี้:

$results = Project::orderBy('name')->get();

อย่าทำอย่างนี้:

$results = Project::all()->sortBy('name');

ทำไม? สั้น ๆ วิธีแรกเร็วกว่าวิธีที่สอง


3
มันจะเป็นการดีที่จะเพิ่มคำอธิบายว่าทำไม: วิธีแรกทำให้การสั่งซื้อที่ระดับฐานข้อมูล (แบบสอบถาม) ซึ่งเกือบจะมีประสิทธิภาพมากขึ้น - ประสิทธิภาพที่ดีที่สุด ฉันจะบอกว่าใช้ Model approach เสมอเมื่อคุณต้องการวิธีที่สองคุณจะรู้ว่า :)
24919


4

หมายเหตุคุณสามารถทำได้:

$results = Project::select('name')->orderBy('name')->get();

สิ่งนี้สร้างแบบสอบถามเช่น:

"SELECT name FROM proyect ORDER BY 'name' ASC"

ในบางแอพพลิเคชั่นเมื่อ DB ไม่ได้รับการปรับให้เหมาะสมและคิวรีมีความซับซ้อนมากขึ้นและคุณต้องป้องกันการสร้าง ORDER BY ใน SQL ที่เสร็จสิ้นคุณสามารถทำได้:

$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();

ตอนนี้ PHP เป็นผู้ที่สั่งผล


0

การเรียนการสอนที่คุณต้องการเรียกเพื่อที่จะได้รับเพราะมันจะนำบันทึกและสั่งซื้อโดยแคตตาล็อก

$results = Project::orderBy('name')
           ->get();

ตัวอย่าง:

$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();

ในตัวอย่างข้อมูลถูกกรองโดย "ที่ไหน" และนำระเบียนที่มากกว่า 20 และแค็ตตาล็อกโดยเรียงลำดับตามลำดับจากสูงไปต่ำ

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