tl; dr: Il est aujourd'hui implémenté dans Laravel, voir "edit 3" ci-dessous.
Malheureusement, à ce jour, la ->orderBy(DB::raw('RAND()'))
solution proposée comporte certaines mises en garde :
- Ce n'est pas indépendant de la DB. par exemple, utilisation de SQLite et PostgreSQL
RANDOM()
Pire encore, cette solution n'est plus applicable depuis ce changement :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Maintenant, vous pouvez utiliser la méthode orderByRaw () :->orderByRaw('RAND()')
. Cependant, ce n'est pas encore indépendant de la DB.
FWIW, CodeIgniter implémente un RANDOM
direction de tri , qui est remplacée par la grammaire correcte lors de la requête. Il semble également être assez facile à mettre en œuvre. On dirait que nous avons un candidat pour améliorer Laravel :)
mise à jour: voici le problème à ce sujet sur GitHub, et ma demande de pull en attente .
edit 2: Coupons la chasse. Depuis Laravel 5.1.18, vous pouvez ajouter des macros au générateur de requêtes:
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]);
});
Usage:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
edit 3: Enfin! Depuis Laravel 5.2.33 ( changelog , PR # 13642 ), vous pouvez utiliser la méthode native inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();