2014-09-30 18 views
5

È possibile utilizzare uno orderBy per i modelli correlati a un oggetto? Cioè, diciamo che ho un modello di post sul blog con un hasMany("Comments"); posso prendere una collezione conOrdinamento di modelli correlati con Laravel/Eloquent

$posts = BlogPost::all(); 

E poi correre attraverso ogni post, e visualizzare la data dell'ultima modifica del commento per ognuno

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

Esiste un modo per impostare l'ordine in cui vengono restituiti i commenti?

risposta

3

L'oggetto restituito dal rapporto è un'istanza eloquente che supporta le funzioni del generatore di query, in modo puoi chiamare i metodi del builder di query su di esso.

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

Inoltre, tenere a mente quando si foreach() tutti i messaggi come questo, che laravel deve eseguire una query per selezionare i commenti per i posti in ogni iterazione, in modo eager loading i commenti che come si vede nei Jarek Tkaczyk's answer è raccomandato.

È anche possibile creare una funzione indipendente per i commenti ordinati come si vede in this question.

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

e poi si può ciclo di loro come avete fatto nel codice originale.

+0

Ah, mi mancava 'get' - anche, non dovrebbe essere una chiamata al metodo' comments'? Se provo con la proprietà magic ottengo 'Chiama a metodo non definito Illuminate \ Database \ Eloquent \ Collection :: orderBy()' –

+0

@AlanStorm Sì, hai ragione, risolto. – totymedli

-2

Sì:

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

E si può anche impostare che nella vostra relazione:

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

+1 per 'with' - non avevo ancora visto che PNE. Tuttavia, 'orderBy' sembra applicarsi alla prima query (selezionare * da blog_posts), e non il secondo. C'è una sintassi diversa per l'applicazione dell'ordine e/o le relazioni devono essere configurate in un certo modo? (facendo riferimento a BlogPost :: con il codice qui, non aggiungendo direttamente le cose alla relazione) –

+4

Questo è sbagliato, non è possibile fare riferimento alla tabella correlata in questo modo, perché non è utilizzato nella query principale (su cui si applica orderBy) –

12

Questo è il modo corretto:

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

Ah ah, grazie! –

Problemi correlati