tl; dr: Atualmente é implementado no Laravel, veja "edit 3" abaixo.
Infelizmente, a partir de hoje existem algumas advertências com a ->orderBy(DB::raw('RAND()'))
solução proposta:
- Não é agnóstico ao DB. por exemplo, uso SQLite e PostgreSQL
RANDOM()
Pior ainda, esta solução não é mais aplicável desde essa alteração :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Agora você pode usar o orderByRaw () método: ->orderByRaw('RAND()')
. No entanto, isso ainda não é agnóstico ao DB.
FWIW, CodeIgniter implementa uma RANDOM
direção de classificação especial , que é substituída pela gramática correta ao criar a consulta. Também parece ser bastante fácil de implementar. Parece que temos um candidato para melhorar o Laravel :)
update: aqui está o problema sobre isso no GitHub e minha solicitação de recebimento pendente .
edit 2: Vamos direto ao assunto. Desde o Laravel 5.1.18, você pode adicionar macros ao construtor 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();
edit 3: Finalmente! Desde o Laravel 5.2.33 ( changelog , PR # 13642 ), você pode usar o método nativo inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();