ลำดับ Laravel ตามความสัมพันธ์


116

ฉันวนซ้ำความคิดเห็นทั้งหมดที่โพสต์โดยผู้เขียนโพสต์หนึ่ง ๆ

foreach($post->user->comments as $comment)
    {
        echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

สิ่งนี้ทำให้ฉัน

I love this post (3)
This is a comment (5)
This is the second Comment (3)

ฉันจะสั่งซื้อโดย post_id ได้อย่างไรเพื่อให้รายการด้านบนเรียงลำดับเป็น 3,3,5

คำตอบ:


247

เป็นไปได้ที่จะขยายความสัมพันธ์ด้วยฟังก์ชันเคียวรี:

<?php
public function comments()
{
    return $this->hasMany('Comment')->orderBy('column');
}

[แก้ไขหลังความคิดเห็น]

<?php
class User
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

class Controller
{
    public function index()
    {
        $column = Input::get('orderBy', 'defaultColumn');
        $comments = User::find(1)->comments()->orderBy($column)->get();

        // use $comments in the template
    }
}

รูปแบบผู้ใช้เริ่มต้น + ตัวอย่างคอนโทรลเลอร์อย่างง่าย เมื่อได้รับรายการความคิดเห็นให้ใช้ orderBy () ตาม Input :: get () (อย่าลืมทำการตรวจสอบอินพุต;))


2
มีคนแนะนำเรื่องนี้ใน Laravel Forum แล้ว แต่ฉันต้องการให้ทำได้ใน Controller เพื่อที่ฉันจะได้เลือกฟิลด์ที่จะเรียงลำดับตามข้อมูลที่ผู้ใช้ป้อน ฉันควรจะอธิบายให้ชัดเจนขึ้นในคำถามนี้
PrestonDocks

ฉันได้เพิ่มตัวอย่างที่สอง
Rob Gordijn

1
ขอบคุณร็อบคุณทำให้ฉันมาถูกทางแล้ว คำตอบที่แท้จริงคือ $ comments = User :: find (10) -> comments () -> orderBy ('post_id') -> get (); ดูเหมือนว่าจะต้องใช้เมธอด get () เพื่อให้ทำงานได้ หากคุณสามารถเพิ่ม get () ในคำตอบของคุณได้ฉันจะทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับ
PrestonDocks

2
วิธีนี้ใช้งานได้ดีหากคุณกำลังเรียกข้อมูลระเบียนเดียว แต่ถ้าคุณกำลังเรียกข้อมูลหลายระเบียนคุณจะต้องการบางสิ่งเพิ่มเติมตามบรรทัดของstackoverflow.com/a/26130907/1494454
dangel

หากคุณใช้ mysql โหมดเข้มงวดซึ่งเป็นค่าเริ่มต้นใน Laravel 5.4 f.ex คุณจะได้รับ SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1140 การผสมคอลัมน์ GROUP ...
Sabine

9

ฉันเชื่อว่าคุณสามารถทำได้:

$sortDirection = 'desc';

$user->with(['comments' => function ($query) use ($sortDirection) {
    $query->orderBy('column', $sortDirection);
}]);

ที่ช่วยให้คุณสามารถเรียกใช้ตรรกะโดยพลการในแต่ละบันทึกความคิดเห็นที่เกี่ยวข้อง คุณสามารถมีของอยู่ในนั้นเช่น:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);

1
ไม่ ฉันได้ลองแล้วมันไม่ได้ผล นี่คือกรณีของฉัน: ฉันมีสองตาราง ( appointmentsและschedules) แบบสอบถามง่ายๆคือ: ได้รับการสั่งซื้อโดยappointments จากมากไปน้อย ผมมีวิธีการแก้ปัญหาโดยการเพิ่มคอลัมน์ใหม่ในตารางการจัดเก็บจากตาราง และตอนนี้ฉันต้องสั่งซื้อเท่านั้น ฉันรู้ว่ามันไม่ใช่วิธีที่ดีที่สุด แต่มันช่วยแก้ปัญหาได้ XDschedulesdatetimeappointmentsdatetimeschedulesappointmentsdatetime
Fendi Setiawan

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