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

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;))


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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.