tl; dr: Ngày nay, nó đã được triển khai thành Laravel, xem "chỉnh sửa 3" bên dưới.
Đáng buồn thay, như ngày nay có một số cảnh báo với ->orderBy(DB::raw('RAND()'))
giải pháp đề xuất:
- Đó không phải là thuyết bất khả tri. ví dụ: sử dụng SQLite và PostgreSQL
RANDOM()
Thậm chí tệ hơn, giải pháp này không còn được áp dụng nữa kể từ khi thay đổi này :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
chỉnh sửa: Bây giờ bạn có thể sử dụng phương thức orderByRaw () : ->orderByRaw('RAND()')
. Tuy nhiên đây vẫn không phải là thuyết bất khả tri.
FWIW, CodeIgniter thực hiện một RANDOM
hướng sắp xếp đặc biệt , được thay thế bằng ngữ pháp chính xác khi xây dựng truy vấn. Ngoài ra nó có vẻ là khá dễ dàng để thực hiện. Có vẻ như chúng tôi có một ứng cử viên để cải thiện Laravel :)
cập nhật: đây là vấn đề về điều này trên GitHub và yêu cầu kéo chờ xử lý của tôi .
chỉnh sửa 2: Hãy cắt đuổi. Kể từ Laravel 5.1.18, bạn có thể thêm macro vào trình tạo truy vấn:
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]);
});
Sử dụng:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
chỉnh sửa 3: Cuối cùng! Kể từ Laravel 5.2.33 ( changelog , PR # 13642 ), bạn có thể sử dụng phương thức gốc inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();