Laravel orderBy pada suatu hubungan

116

Saya mengulang semua komentar yang diposting oleh Penulis posting tertentu.

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

Ini memberi saya

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

Bagaimana saya memesan dengan post_id sehingga daftar di atas diurutkan sebagai 3,3,5

PrestonDocks
sumber

Jawaban:

247

Dimungkinkan untuk memperluas hubungan dengan fungsi query:

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

[edit setelah komentar]

<?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
    }
}

model Pengguna default + contoh Pengontrol sederhana; ketika mendapatkan daftar komentar, cukup terapkan orderBy () berdasarkan Input :: get (). (pastikan untuk melakukan pengecekan input;))

Rob Gordijn
sumber
2
Seseorang sudah menyarankan ini di Forum Laravel, tetapi saya ingin dapat melakukan ini di Pengontrol sehingga saya dapat memilih bidang mana yang akan disortir berdasarkan masukan pengguna. Mungkin saya harus membuat ini lebih jelas dalam pertanyaan.
PrestonDocks
Saya telah menambahkan contoh kedua
Rob Gordijn
1
Terima kasih Rob, Anda menempatkan saya di jalur yang benar. Jawaban sebenarnya adalah $ comments = User :: find (10) -> comments () -> orderBy ('post_id') -> get (); Tampaknya membutuhkan metode get () agar berfungsi. Jika Anda dapat menambahkan get () ke jawaban Anda, saya akan menandainya sebagai jawaban yang diterima.
PrestonDocks
2
Ini berfungsi dengan baik jika Anda mengambil satu catatan, tetapi jika Anda mengambil banyak catatan, Anda akan menginginkan sesuatu yang lebih seperti stackoverflow.com/a/26130907/1494454
dangel
Jika Anda menggunakan mode ketat mysql, yang merupakan default di Laravel 5.4, f.ex Anda akan menerima SQLSTATE [42000]: Kesalahan sintaks atau pelanggaran akses: 1140 Pencampuran kolom GROUP ...
Sabine
8

Saya yakin Anda juga bisa melakukan:

$sortDirection = 'desc';

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

Itu memungkinkan Anda menjalankan logika arbitrer pada setiap rekaman komentar terkait. Anda bisa memiliki barang-barang di sana seperti:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);
agm1984
sumber
1
Nggak. Saya sudah mencoba ini, tidak berhasil. Inilah kasus saya: Saya memiliki dua tabel ( appointmentsdan schedules), kueri sederhana: dapatkan appointmentspesanan berdasarkan schedules. datetimemenurun. Saya punya solusi dengan menambahkan kolom baru dalam tabel appointmentsuntuk menyimpan datetimedari tabel schedules. Dan sekarang saya hanya perlu memesan sebelum appointments. datetimeSaya tahu itu bukan metode terbaik, tetapi itu menyelesaikan masalah. XD
Fendi Setiawan
Terima kasih banyak, ini berhasil dalam kasus saya, itu luar biasa.
Pooria Honarmand