tl;dr: Es ist heutzutage in Laravel implementiert, siehe "edit 3" unten.
Leider gibt es seit heute einige Vorbehalte gegen die ->orderBy(DB::raw('RAND()'))
vorgeschlagene Lösung:
- Es ist nicht DB-agnostisch. z.B. verwenden SQLite und PostgreSQL
RANDOM()
-
Schlimmer noch, diese Lösung ist nicht mehr anwendbar, seit diese Änderung :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
bearbeiten: Jetzt können Sie die orderByRaw() Methode: ->orderByRaw('RAND()')
. Dies ist jedoch immer noch nicht DB-agnostisch.
FWIW, CodeIgniter implementiert eine spezielle RANDOM
Sortierrichtung, die beim Erstellen der Abfrage durch die richtige Grammatik ersetzt wird. Außerdem scheint es ziemlich einfach zu implementieren zu sein. Sieht aus wie wir einen Kandidaten für die Verbesserung von Laravel haben :)
update: hier ist die Ausgabe darüber auf GitHub, und meine ausstehende Pull-Anfrage .
bearbeiten 2: Machen wir es kurz. Seit Laravel 5.1.18 können Sie Makros zum Query Builder hinzufügen:
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]);
});
Verwendung:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
bearbeiten 3: Endlich! Seit Laravel 5.2.33 ( Änderungsprotokoll , PR #13642 ) können Sie die native Methode inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();