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:
- No es independiente de DB. por ejemplo, uso de SQLite y PostgreSQL
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:
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 ( registro de cambios , 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();