tl; dr: В настоящее время он реализован в Laravel, см. «edit 3» ниже.
К сожалению, на сегодняшний день есть несколько предостережений с ->orderBy(DB::raw('RAND()'))
предлагаемым решением:
- Это не DB-агностик. например, использование SQLite и PostgreSQL
RANDOM()
Хуже того, это решение больше не применимо после этого изменения :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
Редактирование: Теперь вы можете использовать orderByRaw () метод: ->orderByRaw('RAND()')
. Однако это все еще не DB-агностик.
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 ( changelog , PR # 13642 ) вы можете использовать собственный метод inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();