tl; dr: Bugünlerde Laravel'e uygulandı, aşağıdaki "düzenle 3" e bakın.
Ne yazık ki, bugün itibariyle ->orderBy(DB::raw('RAND()'))
önerilen çözümle ilgili bazı uyarılar var :
- DB-agnostik değil. örneğin SQLite ve PostgreSQL kullanımı
RANDOM()
Daha da kötüsü, bu değişiklik bu değişiklikten bu yana artık geçerli değil :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
düzenleme: Artık kullanabilirsiniz orderByRaw () yöntemini: ->orderByRaw('RAND()')
. Ancak bu hala DB agnostik değildir.
FWIW, CodeIgniter özel bir uygulama RANDOM
, sorgu oluşturulurken doğru dilbilgisi ile değiştirilen sıralama yönü . Ayrıca uygulanması oldukça kolay görünüyor. Görünüşe göre Laravel'i geliştirmek için bir adayımız var :)
Güncelleme: İşte GitHub'da bununla ilgili sorun ve bekleyen çekme isteğim .
düzenlemek 2: Let's cut the chase. Laravel 5.1.18'den bu yana, sorgu oluşturucuya makrolar ekleyebilirsiniz:
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]);
});
Kullanımı:
User::where('active', 1)->orderByRandom()->limit(10)->get();
DB::table('users')->where('active', 1)->orderByRandom()->limit(10)->get();
edit 3: Sonunda! Laravel 5.2.33'ten ( changelog , PR # 13642 ) yerel yöntemi kullanabilirsiniz inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();