Laravel düzeni Bir ilişkiye göre


116

Yazar tarafından belirli bir gönderinin gönderdiği tüm yorumların üzerinden geçiyorum.

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

Bu bana verir

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

Yukarıdaki listenin 3,3,5 olarak sıralanması için post_id ile nasıl sipariş veririm

Yanıtlar:


247

Sorgu fonksiyonlarıyla ilişkiyi genişletmek mümkündür:

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

[yorumdan sonra düzenle]

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

varsayılan Kullanıcı modeli + basit Denetleyici örneği; yorumların listesini alırken, Input :: get () 'e göre orderBy ()' yi uygulayın. (biraz girdi denetimi yaptığınızdan emin olun;))


2
Birisi bunu Laravel Forumunda önerdi, ancak bunu Denetleyicide yapabilmek istiyorum, böylece kullanıcı girdisine göre hangi alanı sıralayacağımı seçebilirim. Belki soruda bunu daha açık hale getirmeliydim.
PrestonDocks

İkinci bir örnek ekledim
Rob Gordijn

1
Teşekkürler Rob, beni doğru yola soktun. Asıl cevap $ comments = User :: find (10) -> yorumlar () -> orderBy ('post_id') -> get (); Çalışmak için get () yöntemine ihtiyaç var gibiydi. Cevabınıza get () ekleyebilirseniz, onu kabul edilen cevap olarak işaretleyeceğim.
PrestonDocks

2
Bu, tek bir kaydı alıyorsanız iyi çalışır, ancak birden fazla kayıt
alıyorsanız

Laravel 5.4'te varsayılan olan mysql katı modunu kullanırsanız, f.ex SQLSTATE [42000]: Sözdizimi hatası veya erişim ihlali: 1140 GROUP sütunlarının karıştırılması ...
Sabine

8

Ayrıca yapabileceğine inanıyorum:

$sortDirection = 'desc';

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

Bu, ilgili her yorum kaydı üzerinde rastgele mantık çalıştırmanıza olanak tanır. Orada şu gibi şeyler olabilir:

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

1
Hayır! Bunu denedim, işe yaramıyor. İşte benim durumum: İki tablom var ( appointmentsve schedules), sorgu basit: appointmentssipariş al schedules. datetimeAzalan. Tablodan appointmentssaklamak datetimeiçin tabloya yeni sütun ekleyerek çözüme sahibim schedules. Ve şimdi sadece sipariş vermem gerekiyor appointments. datetimeBunun en iyi yöntem olmadığını biliyorum ama sorunu çözüyor. XD
Fendi™

Çok teşekkür ederim, benim durumumda işe yaradı, inanılmazdı.
Pooria Honarmand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.