random eloquent laravel-5

laravel random



cómo obtener al azar fila laravel-5 (9)

En L-4 fue simple:

$random_quote = Quotation::all()->random(1);

Pero ahora en L-5 no funciona ni un solo método descrito en esta publicación: Laravel - Fila aleatoria elocuente o fluida

Mi archivo de vista simplemente se pone en blanco. ¿Algunas ideas?

EDITAR:

Resuelto: $ random_quote = Cita :: orderByRaw ("RAND ()") -> first ();


ACTUALIZACIÓN PARA LARAVEL 5.3

¡Me complació descubrir que ahora esta es una función de consulta nativa! :RE

El método inRandomOrder se puede usar para ordenar los resultados de la consulta aleatoriamente. Por ejemplo, puede usar este método para buscar un usuario aleatorio:

$randomUser = DB::table(''users'') ->inRandomOrder() ->first();

Lamentablemente, ninguna de estas respuestas hace un uso completo de las colecciones de Laravel 5. Si viniste aquí desde Google, como yo, en busca de una solución completamente nativa, mira a continuación.

La respuesta de The Alpha tiene la falla de dependencia de la base de datos y la de Benjamin, como señaló, puede plantear un problema cuando las filas se eliminan en el medio. Muy poco probable, pero aún posible.

Aquí hay una solución de una línea para seleccionar filas aleatorias en Laravel 5+

// The setup $numberOfRows = 4; $models = Model::all(); // or use a ::where()->get(); // And the actual randomisation line $randRows = $models->shuffle()->slice(0,numberOfRows);

Et voila: ¡feliz codificación! Vótelo cuando lo veas para que suba en la página :)



El orderByRaw (''RAND ()'') tiene 2 problemas:

  1. Es dependiente del servidor MySQL
  2. Puede ser lento en tablas grandes (recupera todas las filas)

Aquí está la solución que usé, que parece ser un poco mejor:

$cnt = $records->count(); if ($cnt == 0) return; $randIndex = rand(0, $cnt-1); $obj = $records->skip($randIndex)->take(1)->first();

EDITAR: Tenga en cuenta que mi solución puede ser un problema (bloqueo si no tiene suerte) en caso de solicitudes paralelas a la base de datos, si se eliminan algunos registros entre el "conteo ()" y el "salto ()".


En Laravel 5.1 (y Laravel 5.2) hay un método random en la clase Collection devuelto por el constructor Eloquent.

https://laravel.com/docs/5.1/collections#available-methods

Entonces tu llamada

$random_quote = Quotation::all()->random(1);

o

$random_quote = Quotation::where(''column'', ''value'')->get()->random(1);

debería funcionar correctamente


Estos trabajos pero probablemente no usaste el namespace correcto, solo utiliza la instrucción de use en la parte superior del nombre de tu class como esta:

<?php namespace SomeNamespace; use App/Quotation; // Says "Quotation.php" is in "App" folder (By default in L-5.0) class someClass { //... }

Entonces puedes usar en tu method algo como esto:

// You may add: use DB; at the top to use DB instead of /DB $random_quote = Quotation::orderBy(/DB::raw(''RAND()''))->first();

O esto:

$random_quote = Quotation::orderByRaw("RAND()")->first();

Actualización (desde Laravel - 5.2):

$random_quote = Quotation::inRandomOrder()->first();


Implementaría esto un poco diferente, usando la idea de Benjamin . Un Alcance de consulta para esto se considera apropiado, por lo que es reutilizable y corresponde a su uso Eloquente normal.

Nota: En Eloquent 5.2, existe un soporte integrado para ámbitos globales.

Voy a crear un rasgo que los modelos puedan utilizar, pero solo puede agregar el método scopeRandom directamente a su modelo específico.

/app/GlobalScopes.php

<?php namespace App; use Illuminate/Database/Eloquent/Model; trait GlobalScopes { public function scopeRandom($query){ $totalRows = static::count() - 1; $skip = $totalRows > 0 ? mt_rand(0, $totalRows) : 0; return $query->skip($skip)->take(1); } }

Luego, cada modelo que desee utilizar los ámbitos globales, nombre el rasgo dentro de la clase.

/app/Quotation.php

<?php namespace App; use Illuminate/Database/Eloquent/Model; class Quotation extends Model { use GlobalScopes; //... }

En uso:

$randomQuote = /Quotation::random()->first();


Laravel 5.4

1) si necesita un modelo aleatorio:

$object = Model::all()->random();

2) si necesita muchos modelos aleatorios:

$object = Model::all()->random($n); //$n - number of elements //$object - collection

Comentario: Llamar $ collection-> random (1) ahora devolverá una nueva instancia de colección con un elemento. Este método solo devolverá un solo objeto si no se proporcionan argumentos.

Doc ref: https://laravel.com/docs/5.4/collections#method-random



orderByRaw(''RAND()'')

Nota: Tomará en ram todas las filas del resto de la consulta, por lo que si tiene una tabla grande sin otros filtros en la misma consulta dará malos resultados, de lo contrario, esta es su opción