tl; dr: Obecnie jest zaimplementowany w Laravel, patrz „edycja 3” poniżej.
Niestety, na dzień dzisiejszy istnieją pewne zastrzeżenia dotyczące ->orderBy(DB::raw('RAND()'))
proponowanego rozwiązania:
- To nie jest DB-agnostyk. np. użycie SQLite i PostgreSQL
RANDOM()
Co gorsza, to rozwiązanie nie ma już zastosowania, ponieważ ta zmiana :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
edycja: Teraz możesz użyć metody orderByRaw () :->orderByRaw('RAND()')
. Jednak nadal nie jest to agnostyk DB.
FWIW, CodeIgniter implementuje specjalną RANDOM
kierunek sortowania, który jest zastępowany poprawną gramatyką podczas budowania zapytania. Wydaje się również, że jest dość łatwy do wdrożenia. Wygląda na to, że mamy kandydata na ulepszenie Laravela :)
aktualizacja: tutaj jest problem na GitHub i moje oczekujące żądanie ściągnięcia .
edycja 2: Wytnijmy pościg. Od wersji Laravel 5.1.18 możesz dodawać makra do konstruktora zapytań:
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]);
});
Stosowanie:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
edycja 3: Wreszcie! Od wersji Laravel 5.2.33 (dziennik zmian , PR # 13642 ) możesz używać metody natywnej inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();