tl; dr: Це зараз реалізовано в Laravel, див. "редагувати 3" нижче.
На жаль, на сьогодні існує кілька застережень із ->orderBy(DB::raw('RAND()'))
запропонованим рішенням:
- Це не БД-агностик. наприклад, використання SQLite та PostgreSQL
RANDOM()
Ще гірше, що це рішення більше не застосовується з моменту цієї зміни :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
редагувати: Тепер ви можете використовувати метод orderByRaw () :->orderByRaw('RAND()')
. Однак це все ще не БД-агностик.
FWIW, CodeIgniter реалізує спеціальну RANDOM
напрямок сортування, який замінюється правильною граматикою при побудові запиту. Крім того, це здається досить простим у виконанні. Схоже, у нас є кандидат на покращення Laravel :)
оновлення: ось проблема з цим на GitHub, і мій запит на вичісування .
редагувати 2: Давайте виріжемо погоню. Оскільки Laravel 5.1.18 ви можете додати макроси до конструктора запитів:
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]);
});
Використання:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
редагувати 3: Нарешті! Оскільки Laravel 5.2.33 (журнал змін , PR # 13642 ), ви можете використовувати власний метод inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();