tl; dr: यह आजकल लारवेल में लागू किया गया है, नीचे "3 संपादित करें" देखें।
अफसोस की बात है, आज के रूप में ->orderBy(DB::raw('RAND()'))
प्रस्तावित समाधान के साथ कुछ चेतावनी हैं:
- यह डीबी-अज्ञेय नहीं है। जैसे SQLite और PostgreSQL का उपयोग
RANDOM()
इससे भी बदतर, यह समाधान इस परिवर्तन के बाद से लागू नहीं है :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
संपादित करें: अब आप ऑर्डरबेयर () विधि का उपयोग कर सकते हैं :->orderByRaw('RAND()')
:। हालाँकि यह अभी भी डीबी-अज्ञेयवादी नहीं है।
FWIW, CodeIgniter एक विशेष लागू करता है RANDOM
छँटाई दिशा को , जिसे क्वेरी बनाते समय सही व्याकरण से बदल दिया जाता है। इसके अलावा इसे लागू करना काफी आसान लगता है। लगता है कि हमारे पास लारवेल में सुधार के लिए एक उम्मीदवार है :)
अद्यतन: यहाँ GitHub पर इस बारे में समस्या है, और मेरा लंबित पुल अनुरोध है ।
संपादन 2: चलो पीछा काटते हैं। लारवेल 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 (के बाद से बदलाव का , पीआर # 13642 ) आप देशी पद्धति का उपयोग कर सकते हैं inRandomOrder()
:
User::where('active', 1)->inRandomOrder()->limit(10)->get();
DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();