Ordenar los modelos adquiridos a través de las relaciones en Eloquent se puede hacer de dos maneras distintas.
- La primera consiste simplemente en declarar la relación en el modelo, aplicando el orden directamente en ella. Es decir, al hacer el método que devuelve los modelos relacionados con algo como hasMany() o belongsToMany() usas los métodos adicionales de Laravel Query Builder para conseguir el orden deseado.
Por ejemplo puedes ver este código en el que se define la relación de tags y luego los tags se ordenan por el título.
public function tags() {
return $this->hasMany('App\Tag')->orderBy('title');
}
Este mecanismo tiene la comodidad que, cada vez que se realice la consulta para obtener los modelos relacionados, se ordenará por el título. Ya sea cuando usas with para aplicar Eager Loading o carga anticipada, como cuando accedas a los datos una vez realizada la consulta por lazy loading.
$posts = Post::with('tags')->get();
- Como alternativa, podemos hacer esto mismo directamente cuando hacemos la consulta Eager Loading, con el with().
En este caso la relación con el modelo puede quedar simplemente definida sin indicar ningún orden:
public function tags() {
return $this->hasMany('App\Tag');
}
Y al hacer la consulta para traerte los modelos relacionados con with, entonces aplicas el orden deseado:
$posts = Post::with(['tags' => function($query) {
$query->orderBy('title')
})->get();
Este segundo mecanismo da un poco más de trabajo, puesto que tienes que especificar el orden cada vez que haces la consulta con el método with(). Sin embargo es más versátil, porque puedes hacer consultas donde los modelos relacionados podrán estar ordenados de un modo o de otro, según se necesite en cada caso.