Ordenar modelos relacionados con Laravel / Eloquent

¿Es posible usar una orderBy para los modelos relacionados de un objeto? Es decir, digamos que tengo un modelo de publicación de blog con un hasMany("Comments"); Puedo buscar una colección con

 $posts = BlogPost::all(); 

Y luego revise cada publicación y muestre la última fecha editada del comentario para cada una

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

¿Hay alguna forma de configurar el orden en el que se devuelven los comentarios?

El objeto devuelto de la relación es una instancia Eloquent que admite las funciones del generador de consultas, por lo que puede invocar métodos de creación de consultas.

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

Además, tenga en cuenta cuando foreach() todas las publicaciones como esta, que Laravel tiene que ejecutar una consulta para seleccionar los comentarios para las publicaciones en cada iteración, por lo que está ansioso por cargar los comentarios como se ve en la respuesta de Jarek Tkaczyk .

También puede crear una función independiente para los comentarios ordenados como ve en esta pregunta .

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

Y luego puedes repetirlos como lo hiciste en tu código original.

Esta es la forma correcta:

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

Sí:

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

Y también puedes establecer eso en tu relación:

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