tl; dr: Saat ini diterapkan ke Laravel, lihat "sunting 3" di bawah.
Sayangnya, sampai hari ini ada beberapa peringatan dengan ->orderBy(DB::raw('RAND()'))
solusi yang diusulkan:
- Itu bukan DB-agnostik. misalnya penggunaan SQLite dan PostgreSQL
RANDOM()
Lebih buruk lagi, solusi ini tidak berlaku lagi sejak perubahan ini :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
sunting: Sekarang Anda dapat menggunakan metode orderByRaw () :->orderByRaw('RAND()')
. Namun ini masih bukan DB-agnostik.
FWIW, CodeIgniter mengimplementasikan khusus RANDOM
arah penyortiran , yang diganti dengan tata bahasa yang benar ketika membangun kueri. Juga tampaknya cukup mudah diimplementasikan. Sepertinya kami memiliki kandidat untuk meningkatkan Laravel :)
pembaruan: inilah masalah tentang ini di GitHub, dan permintaan tarik saya yang tertunda .
edit 2: Mari kita memotong pengejaran. Karena Laravel 5.1.18 Anda dapat menambahkan makro ke pembuat kueri:
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]);
});
Pemakaian:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
edit 3: Akhirnya! Karena Laravel 5.2.33 ( changelog , PR # 13642 ) Anda dapat menggunakan metode asli inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();