tl; dr: oggi è implementato in Laravel, vedi "modifica 3" di seguito.
Purtroppo, ad oggi ci sono alcuni avvertimenti con la ->orderBy(DB::raw('RAND()'))
soluzione proposta:
- Non è indipendente dal DB. es. uso di SQLite e PostgreSQL
RANDOM()
Ancora peggio, questa soluzione non è più applicabile dal momento che questa modifica :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Ora è possibile utilizzare l'orderByRaw () metodo: ->orderByRaw('RAND()')
. Tuttavia, questo non è ancora DB-agnostico.
FWIW, CodeIgniter implementa una RANDOM
direzione di ordinamento speciale , che viene sostituita con la grammatica corretta durante la creazione di query. Inoltre sembra essere abbastanza facile da implementare. Sembra che abbiamo un candidato per migliorare Laravel :)
aggiornamento: ecco il problema al riguardo su GitHub e la mia richiesta pull in sospeso .
modifica 2: tagliamo l'inseguimento. Da Laravel 5.1.18 è possibile aggiungere macro al generatore di query:
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();
modifica 3: Finalmente! Dal momento che laravel 5.2.33 ( changelog , PR # 13642 ) è possibile utilizzare il metodo nativo inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();