tl; dr: Es ist heutzutage in Laravel implementiert, siehe "edit 3" unten.
Leider gibt es ab heute einige Einschränkungen bei der ->orderBy(DB::raw('RAND()'))
vorgeschlagenen Lösung:
- Es ist nicht DB-agnostisch. zB SQLite und PostgreSQL verwenden
RANDOM()
Schlimmer noch, diese Lösung ist seit dieser Änderung nicht mehr anwendbar :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edit: Jetzt können Sie die orderByRaw () -Methode verwenden : ->orderByRaw('RAND()')
. Dies ist jedoch immer noch nicht DB-agnostisch.
FWIW, CodeIgniter implementiert eine spezielle RANDOM
Sortierrichtung, die beim Erstellen von Abfragen durch die richtige Grammatik ersetzt wird. Es scheint auch ziemlich einfach zu implementieren zu sein. Sieht so aus, als hätten wir einen Kandidaten für die Verbesserung von Laravel :)
Update: Hier ist das Problem auf GitHub und meine ausstehende Pull-Anfrage .
edit 2: Lass uns die Jagd abschneiden. Seit Laravel 5.1.18 können Sie dem Abfrage-Generator Makros 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();
edit 3: Endlich! Seit Laravel 5.2.33 ( Changelog , PR # 13642 ) können Sie die native Methode verwenden inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();