Laravel Eloquent: resultados de pedidos de todos ()

214

Estoy atrapado en una tarea simple. Solo necesito ordenar los resultados de esta llamada

$results = Project::all();

Donde Projectes un modelo. He intentado esto

$results = Project::all()->orderBy("name");

Pero no funcionó. ¿Cuál es la mejor manera de obtener todos los datos de una tabla y ordenarlos?

MatterGoal
fuente

Respuestas:

114

Todavía podría usar sortBy (en el nivel de colección) en lugar de orderBy (en el nivel de consulta) si aún desea usar all () ya que devuelve una colección de objetos.

Orden ascendente

$results = Project::all()->sortBy("name");

Orden descendiente

$results = Project::all()->sortByDesc("name");

Consulte la documentación sobre Colecciones para obtener más detalles.

https://laravel.com/docs/5.1/collections

Yannick Y
fuente
Exactamente lo que estaba buscando. ¿El uso extensivo de esto tendría inconvenientes en comparación con el uso orderByen el nivel de consulta?
Giedrius
1
\ @foreach ($ posts-> sortByDesc ('created_at') como $ post) \ @include ('posts.post') \ @endforeach
sdexp
2
Estoy interesado en saber cómo funciona esto detrás de escena. Me parece que ordenar la colección sortBy()ocurre dentro del Laravel Engine (en PHP), mientras que orderBy()se realiza en la base de datos. Seguramente la base de datos será más rápida en casi todas las situaciones concebibles, y a medida que aumente su conjunto de datos, también lo hará la disparidad en el rendimiento. Me encantaría escuchar los pensamientos de otras personas sobre esto.
cartbeforehorse
3
@cartbeforehorse Necesita saber qué método devuelve qué. :: all () probablemente solo invoca -> get () debajo del capó, que, a su vez, devuelve una colección. sortBy () es un método de una colección, por lo que sí ocurre en el lado de PHP (a diferencia de orderBy () que se llama en un objeto de consulta). Es una mala idea usar :: all () en absoluto, y mucho menos ordenarlo en PHP. Imagina si :: all () devuelve una colección con un millón de objetos. Tomará demasiado tiempo buscarlo e incluso más tiempo para ordenarlo en PHP. Por supuesto, puede usar :: all () si sabe con seguridad que devolverá solo un puñado de objetos (en una colección).
Avram
¿Por qué esta no es la respuesta aceptada? funcionó con la función all ().
VishalParkash
36

Además, solo para reforzar las respuestas anteriores, también se podría ordenar en orden descendente desco ascendente ascagregando el segundo parámetro.

$results = Project::orderBy('created_at', 'desc')->get();
ken4ward
fuente
14

Actualización 2017


Laravel 5.4 agregó métodos orderByDesc () al generador de consultas:

$results = Project::orderByDesc('name')->get();
Sebastien Horin
fuente
10

Si bien necesita un resultado para la fecha como desc

$results = Project::latest('created_at')->get();
DsRaj
fuente
9

HACER ESTO:

$results = Project::orderBy('name')->get();

NO HAGAS ESTO:

$results = Project::all()->sortBy('name');

¿POR QUÉ? Brevemente, el primer enfoque es más rápido que el segundo enfoque.

doncadavona
fuente
3
Sería bueno agregar una explicación del por qué: el primer enfoque hace que el orden en el nivel de la base de datos (consulta) sea casi siempre mucho más eficiente: el mejor rendimiento. Yo diría que utilizar el enfoque de modelo siempre, en las que necesitará el segundo enfoque, usted sabrá :)
jave.web
4

Tenga en cuenta que puede hacer:

$results = Project::select('name')->orderBy('name')->get();

Esto genera una consulta como:

"SELECT name FROM proyect ORDER BY 'name' ASC"

En algunas aplicaciones cuando la base de datos no está optimizada y la consulta es más compleja, y necesita evitar generar un ORDER BY en el SQL final, puede hacer lo siguiente:

$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();

Ahora es php quien ordena el resultado.

hkcoyant
fuente
0

Su instrucción requiere una llamada para obtener, porque es traer los registros y ordenar por el catálogo

$results = Project::orderBy('name')
           ->get();

Ejemplo:

$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();

En el ejemplo, los datos se filtran por "dónde" y traen registros superiores a 20 y orden por catálogo por orden de mayor a menor.

Vhngroup Tecnologia
fuente