¿Cómo puedo seleccionar una fila aleatoria usando Eloquent o Fluent en el marco de Laravel?
Sé que al usar SQL, puede ordenar por RAND (). Sin embargo, me gustaría obtener la fila aleatoria sin contar el número de registros antes de la consulta inicial.
¿Algunas ideas?
Respuestas:
Laravel> = 5.2:
o
o para obtener el número específico de registros
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Laravel 3:
Consulte este artículo sobre filas aleatorias de MySQL. Laravel 5.2 es compatible con esto, para una versión anterior, no hay mejor solución que usar consultas RAW .
editar 1: como mencionó Double Gras, orderBy () no permite nada más que ASC o DESC desde este cambio. Actualicé mi respuesta en consecuencia.
edit 2: Laravel 5.2 finalmente implementa una función de contenedor para esto. Se llama inRandomOrder () .
fuente
'RANDOM()'
Esto funciona bien
También puede cambiar el argumento en función aleatoria para obtener más de un registro.
Nota: no se recomienda si tiene datos enormes, ya que esto buscará primero todas las filas y luego devolverá un valor aleatorio.
fuente
tl; dr: Actualmente está implementado en Laravel, ver "editar 3" a continuación.
Lamentablemente, a partir de hoy hay algunas advertencias con la
->orderBy(DB::raw('RAND()'))
solución propuesta:RANDOM()
Peor aún, esta solución ya no es aplicable ya que este cambio :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
editar: ahora puede usar el método orderByRaw () :
->orderByRaw('RAND()')
. Sin embargo, esto todavía no es independiente de DB.FWIW, CodeIgniter implementa un especial
RANDOM
dirección de clasificación , que se reemplaza con la gramática correcta al generar la consulta. También parece ser bastante fácil de implementar. Parece que tenemos un candidato para mejorar Laravel :)actualización: aquí está el problema sobre esto en GitHub, y mi solicitud de extracción pendiente .
editar 2: cortemos la persecución. Desde Laravel 5.1.18 puede agregar macros al generador de consultas:
Uso:
Edición 3: ¡Finalmente! Desde Laravel 5.2.33 ( registro de cambios , PR # 13642 ) puede usar el método nativo
inRandomOrder()
:fuente
En laravel 4 y 5 el
order_by
se sustituye pororderBy
Entonces, debería ser:
fuente
Puedes usar :
fuente
Para Laravel 5.2> =
usa el método Eloquent:
El método inRandomOrder puede usarse para ordenar los resultados de la consulta al azar. Por ejemplo, puede usar este método para buscar un usuario aleatorio:
de documentos: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
fuente
También puede usar el método order_by con fluidez y elocuencia como:
Este es un uso un poco extraño, pero funciona.
Editar: como dijo @Alex, este uso es más limpio y también funciona:
fuente
Usar la función Laravel
fuente
Puede usar fácilmente este comando:
// Pregunta: nombre del modelo
// tomar 10 filas de la base de datos en registros aleatorios ...
fuente
Prefiero especificar primero o fallar:
fuente
Laravel tiene un método incorporado para barajar el orden de los resultados.
Aquí hay una cita de la documentación:
El método aleatorio baraja aleatoriamente los elementos de la colección:
Puedes ver la documentación aquí .
fuente
En su modelo agregue esto:
luego en ruta / controlador
fuente
También hay
whereRaw('RAND()')
que hace lo mismo, a continuación, puede cadena->get()
o->first()
incluso volverse loco y añadir->paginate(int)
.fuente
Tengo una tabla con miles de registros, por lo que necesito algo rápido. Este es mi código para la fila pseudoaleatoria:
fuente
$count
solo se recuperaría el primero de ellos, por lo que también sería más probable que se recupere que cualquier otra fila.