Como ordenar una colección de objetos en Laravel

publicado por: Anonymous

Estoy buscando tambien la mejor manera de hacer esto dependiendo mi ejemplo que paso a detallar.

Basicamente lo que hace mi controlador, es traer el nombre categoria seleccionada( desde un navbar), y mediante un scope, traigo la categoria en forma de objeto. Luego por medio de la relacion 1:M traigo todo los articulos de esa categoria. Y bueno lo termina mostrando

Mi tema es que me los ordena por id de manera ascendente. Y siendo articulo me muestra el mas antiguo primero. Lo que necesitaría seria ordenarlos de forma descendentes para q me muestre primero los mas nuevos

public function searchCategoria($nombre){

    $categoria = Categoria::searchCategoria($nombre)->first();
    $articulos = $categoria->articulos()->paginate(5);

    $articulos->each(function($articulos){
        $articulos->categoria;
        $articulos->imagen;
    });
    dd($articulos);
    return view('front/index')->with("articulos",$articulos);
}

Este es el resultado de ese dd de $articulos

LengthAwarePaginator {#249 â–¼
#total: 1
#lastPage: 1
#items: Collection {#250 â–¼
#items: array:1 [â–¼
  0 => Articulo {#252 â–¶}
]
}
#perPage: 5
#currentPage: 1
#path: "http://emap.net/categorias/Noticias"
#query: []
#fragment: null
#pageName: "page"
}

En mi poca experiencia en PHP y mas en Laravel, aun no use algun metodo de ordenamiento. Pero me interesa saber si hay alguna mejor solucion, mediante un orderBy en la relacion dentro del modelo o algo asi. Porque por lo menos en Java el sort siempre es el ultimo recurso.

La otra que se me ocurrio basicamente es traer la categoria, obtener su id y buscar todo los articulos con un where y un orderBy. No estaria haciendo uso de la relacion, seria mas practico pero no se si lo mas correcto

solución

Teniendo en cuenta que ya tienes la colección, yo utilizaría el método sortByDesc() (aplicable a colecciones) con la fecha o el campo deseado antes de aplicar la paginación, sin embargo no tengo como probarlo en este momento y no recuerdo si ya es una colección o aún un query en ese punto.

Colección:

$articulos = $categoria->articulos();
$ordenados = $articulos->sortByDesc('created_at')->paginate(5);

$ordenados->values()->all();

Query builder:

$articulos = $categoria->articulos()->orderBy('created_at', 'desc')->paginate(5);
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *