2014-09-30 12 views
5

Czy możliwe jest użycie modelu orderBy dla powiązanych modeli obiektu? Oznacza to, powiedzmy, mam model z hasMany("Comments"); Blog Post mogę sprowadzić kolekcjęZamawianie powiązanych modeli z Laravel/Eumquent

$posts = BlogPost::all(); 

A następnie uruchomić poprzez każdego posta i wyświetla datę ostatniej edycji komentarza dla każdej jednej

foreach($posts as $post) 
{ 
    foreach($post->comments as $comment) 
    { 
     echo $comment->edited_date,"\n"; 
    } 
} 

Czy istnieje sposób, aby ustawić kolejność, w której są zwracane komentarze?

Odpowiedz

3

Zwracany obiekt z relacji jest wymownym przykładem, który obsługuje funkcje konstruktora zapytań, więc możesz na nim wywoływać metody budowania zapytań.

foreach ($posts as $post) { 
    foreach ($post->comments()->orderBy('edited_date')->get() as $comment) { 
     echo $comment->edited_date,"\n"; 
    } 
} 

Ponadto, należy pamiętać, kiedy foreach() wszystkie posty takie jak ten, że laravel musi uruchomić kwerendę, aby wybrać komentarzy dla stanowisk w każdej iteracji, więc eager loading komentarze jak widać w Jarek Tkaczyk's answer jest zalecane.

Można także utworzyć niezależną funkcję dla uporządkowanych komentarzy, tak jak w przypadku this question.

public function comments() { 
    return $this->hasMany('Comment')->orderBy('comments.edited_date'); 
} 

A potem można je zapętlać tak jak w oryginalnym kodzie.

+0

Ach, brakowało mi 'get' - również, czy nie powinno to być wołaniem do metody' comments'? Jeśli spróbuję tego za pomocą magicznej właściwości, otrzymam: 'Call to undefined method Illuminate \ Database \ Eloquent \ Collection :: orderBy()' –

+0

@AlanStorm Tak, masz rację, popraw to. – totymedli

-2

Tak:

$posts = BlogPost::with('comments') 
      ->orderBy('comments_table_name.column_name') 
      ->get(); 

I można również ustawić, że w swojej relacji:

public comments() 
{ 
    $this->hasMany("Comments")->orderBy('comments.column_name'); 
} 
+0

+1 dla 'with' - Nie widziałem jeszcze tego PNE. Jednak 'orderBy' wydaje się stosować do pierwszego zapytania (wybierz * z blog_posts), a nie drugi. Czy istnieje inna składnia do zastosowania zlecenia przez i/lub czy stosunki muszą być ustawione w określony sposób? (odwołując się do BlogPost :: z kodem tutaj, nie dodając bezpośrednio rzeczy do relacji) –

+4

To jest złe, nie możesz odwoływać się do podobnej tabeli, ponieważ nie jest ona używana w głównym zapytaniu (na które stosujesz orderBy) –

12

Jest to poprawny sposób:

BlogPost::with(['comments' => function ($q) { 
    $q->orderBy('whatever'); 
}])->get(); 
+0

Ah ha, dziękuję! –