whereraw inner php fluent laravel eloquent

php - inner - where like laravel



Laravel: fila aleatoria elocuente o fluida (11)

En Laravel 4 y 5, order_by se reemplaza por orderBy

Entonces, debería ser:

User::orderBy(DB::raw(''RAND()''))->get();

¿Cómo puedo seleccionar una fila al azar usando Eloquent o Fluent en Laravel framework?

Sé que al usar SQL, puede hacer un pedido por RAND (). Sin embargo, me gustaría obtener la fila aleatoria sin contar el número de registros anteriores a la consulta inicial.

¿Algunas ideas?


En su modelo, agregue esto:

public function scopeRandomize($query, $limit = 3, $exclude = []) { $query = $query->whereRaw(''RAND()<(SELECT ((?/COUNT(*))*10) FROM `products`)'', [$limit])->orderByRaw(''RAND()'')->limit($limit); if (!empty($exclude)) { $query = $query->whereNotIn(''id'', $exclude); } return $query; }

luego en la ruta / controlador

$data = YourModel::randomize(8)->get();


Esto funciona bien,

$model=Model::all()->random(1);

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.


Lamentablemente, a partir de hoy hay algunas advertencias con la solución propuesta ->orderBy(DB::raw(''RAND()'')) :

  • No es DB-agnóstico. por ejemplo, SQLite y PostgreSQL usan RANDOM()
  • Peor aún, esta solución ya no es aplicable desde this :

    $direction = strtolower($direction) == ''asc'' ? ''asc'' : ''desc'';


editar: Ahora puede usar el método orderByRaw() : ->orderByRaw(''RAND()'') . Sin embargo, esto aún no es DB-agnóstico.

FWIW, CodeIgniter implementa una dirección de clasificación RANDOM especial, que se reemplaza con la gramática correcta al crear una consulta. También parece ser bastante fácil de implementar. Parece que tenemos un candidato para mejorar Laravel :)

actualización: aquí está el issue sobre esto en GitHub, y mi solicitud de extracción pendiente.


edición 2: cortemos la persecución. Desde Laravel 5.1.18 puede agregar macros al generador de consultas:

use Illuminate/Database/Query/Builder; Builder::macro(''orderByRandom'', function () { $randomFunctions = [ ''mysql'' => ''RAND()'', ''pgsql'' => ''RANDOM()'', ''sqlite'' => ''RANDOM()'', ''sqlsrv'' => ''NEWID()'', ]; $driver = $this->getConnection()->getDriverName(); return $this->orderByRaw($randomFunctions[$driver]); });

Uso:

User::where(''active'', 1)->orderByRandom()->limit(10)->get(); DB::table(''users'')->where(''active'', 1)->orderByRandom()->limit(10)->get();


edición 3: ¡Finalmente! Desde Laravel 5.2.33 ( changelog , PR # 13642 ) puede usar el método nativo inRandomOrder() :

User::where(''active'', 1)->inRandomOrder()->limit(10)->get(); DB::table(''users'')->where(''active'', 1)->inRandomOrder()->limit(10)->get();


Laravel> = 5.2:

User::inRandomOrder()->get();

Laravel 4.2.7 - 5.1:

User::orderByRaw("RAND()")->get();

Laravel 4.0 - 4.2.6:

User::orderBy(DB::raw(''RAND()''))->get();

Laravel 3:

User::order_by(DB::raw(''RAND()''))->get();

Verifique este artículo en las filas aleatorias de MySQL. Laravel 5.2 es compatible con esto, para una versión anterior, no hay mejor solución que el uso de consultas RAW .

edición 1: como menciona Double Gras, orderBy () no permite nada más que ASC o DESC desde this cambio. Actualicé mi respuesta en consecuencia.

edición 2: Laravel 5.2 finalmente implementa una función de envoltura para esto. Se llama inRandomOrder () .


Para Laravel 5.2> =

usa el método Eloquent:

inRandomOrder()

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();

de documentos: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset


Puede usar este comando fácilmente // Pregunta: nombre del modelo // tome 10 filas de db En los registros aleatorios ...

$ questions = Pregunta :: orderByRaw (''RAND ()'') -> take (10) -> get ();


Puedes usar:

ModelName::inRandomOrder()->first();


También puedes usar el método order_by con fluidez y elocuencia como:

Posts::where_status(1)->order_by(DB::raw(''''),DB::raw(''RAND()''));

Este es un uso un poco extraño, pero funciona.

Editar: como @Alex dijo, este uso es más limpio y también funciona:

Posts::where_status(1)->order_by(DB::raw(''RAND()''));


Tengo una tabla con miles de registros, así que necesito algo rápido. Este es mi código para la fila pseudoaleatoria:

// count all rows with flag active = 1 $count = MyModel::where(''active'', ''='', ''1'')->count(); // get random id $random_id = rand(1, $count - 1); // get first record after random id $data = MyModel::where(''active'', ''='', ''1'')->where(''id'', ''>'', $random_id)->take(1)->first();


también hay whereRaw(''RAND()'') que hace lo mismo, puede entonces chain ->get() o ->first() o incluso volverse loco y agregar ->paginate(int)