En la función Laravel Eloquent Model::all(), ¿cuál es el orden predeterminado para la consulta devuelta? Pregunto esto porque estoy bastante seguro de que está en orden ascendente por clave principal, que los valores predeterminados hacen 'id' cuando se completa el modelo.

php artisan make:model Model -m

Sin embargo, cuando lo llamo así:

return $users = User::all();

Obtengo los siguientes resultados en el navegador:

Eloquent all() function results

Los resultados parecen no estar en ningún orden en particular por ninguno de los atributos. Soy plenamente consciente de que puedo ordenarlos por id haciendo

return $users = User::orderBy('id', 'asc')->get();

Pero hace solo unos días se ordenaban automáticamente. ¿Lo que da?

3
Arturo Lozano 5 feb. 2019 a las 03:56

2 respuestas

La mejor respuesta

El orden de clasificación predeterminado para laravel es simplemente nada. No aplica una cláusula "ORDER BY" predeterminada, lo que significa que sigue las reglas de PostgreSQL para resultados desordenados. De algunas respuestas similares aquí y aquí:

  • No dependa del pedido cuando falta ORDER BY.

  • Siempre especifique ORDER BY si desea un pedido en particular; en algunas situaciones, el motor puede eliminar el ORDER BY debido a cómo da algún otro paso.

  • AGRUPAR POR fuerzas ORDENAR POR. (Esta es una violación del estándar. Se puede evitar usando ORDER BY NULL).

SELECT * FROM tbl: esto hará un "escaneo de tabla". Si la mesa tiene nunca tuvo BORRADOS / REEMPLAZOS / ACTUALIZACIONES, los registros pasarán a ser en la orden de inserción, de ahí lo que observó.

Si hubiera hecho la misma declaración con una tabla InnoDB, se habrían entregado en orden PRIMARY KEY, no en orden INSERT. Nuevamente, esto es un artefacto de la implementación subyacente, no algo de lo que depender.

5
Goodbye StackExchange 5 feb. 2019 a las 01:09

Con un gran acuerdo con la respuesta de FrankerZ, me gustaría agregar, cada vez que se pregunte qué consulta laravel está estructurando bajo el ORM, DB listener será la opción más rápida de usar:

<?php

\DB::listen(function($sql) {
    dump($sql);
});

W.r.t. esta pregunta le daría select * from users cuando lo haga User::all().

Nota: Verifique la función de escucha según la versión de laravel que esté utilizando, el recuento de parámetros es diferente en las versiones anteriores y posteriores.

Referencia: Enlace de documentación

0
Mihir Bhende 5 feb. 2019 a las 01:24