লারাভেল - স্বতন্ত্র বা সাবলীল এলোমেলো সারি


242

আমি কীভাবে লারাভেল ফ্রেমওয়ার্কে স্বতন্ত্র বা সাবলীল ব্যবহার করে একটি এলোমেলো সারি নির্বাচন করতে পারি?

আমি জানি যে এসকিউএল ব্যবহার করে আপনি র‌্যান্ড () এর মাধ্যমে অর্ডার করতে পারেন। যাইহোক, আমি র্যান্ডম সারি পেতে চাই ছাড়া প্রাথমিক ক্যোয়ারী পূর্বে রেকর্ড সংখ্যার উপর একটি গণনা করছেন।

কোন ধারনা?


কমপক্ষে দুটি কোয়েরি কার্যকর না করে এটি করার সর্বোত্তম উপায় নেই।
নারকোজ

উত্তর:


584

লারাভেল> = 5.2:

User::all()->random();
User::all()->random(10); // The amount of items you wish to receive

অথবা

User::inRandomOrder()->get();

অথবা রেকর্ডের নির্দিষ্ট নম্বর পেতে

//5 indicates the number of records
User::inRandomOrder()->limit(5)->get();

লারাভেল 4.2.7 - 5.1:

User::orderByRaw("RAND()")->get();

লারাভেল 4.0 - 4.2.6:

User::orderBy(DB::raw('RAND()'))->get();

লারাভেল 3:

User::order_by(DB::raw('RAND()'))->get();

পরীক্ষা করে দেখুন এই নিবন্ধটি মাইএসকিউএল র্যান্ডম সারি উপর। লারাভেল 5.2 এটি সমর্থন করে, পুরানো সংস্করণের জন্য, আরএডাব্লু কোয়েরিগুলি ব্যবহার করার পরে এর চেয়ে ভাল কোনও সমাধান নেই ।

সম্পাদনা 1: ডাবল গ্রাস দ্বারা উল্লিখিত হিসাবে, অর্ডার বাই () এই পরিবর্তনের পরে আরএসসি বা ডিইএসসি এর পরে আর কিছু অনুমতি দেয় না । আমি সেই অনুযায়ী আমার উত্তর আপডেট করেছি।

সম্পাদনা 2: লারাভেল 5.2 শেষ পর্যন্ত এর জন্য একটি মোড়ক ফাংশন প্রয়োগ করে । একে ইনর্যান্ডম অর্ডার () বলা হয় ।


81
আপনি যদি একটি একক সারি চান তবে 'get' এর পরিবর্তে 'প্রথম' করুন।
কলিনের দাম

14
পোস্টগ্রি ব্যবহারের জন্য'RANDOM()'
dwenaus

2
সতর্কতা: বড় ডেটাসেটে এটি খুব ধীর, আমার জন্য প্রায় 900 এমএস যোগ করেছে
এস ..

3
আমরা কি এই পৃষ্ঠায়িত করতে পারি?
ইরফান্দি ডি ভেন্ডি

3
আপনি পারেন তবে বাছাই প্রতিটি নতুন পৃষ্ঠায় এলোমেলো হয়ে যাবে। যা কোনও অর্থবোধ করে না কারণ এটি আপনি F5 টিপানোর মতোই মূলত একই।
aebersold

49

এটি ঠিক কাজ করে,

$model=Model::all()->random(1)->first();

একাধিক রেকর্ড পেতে আপনি এলোমেলো ফাংশনে যুক্তিও পরিবর্তন করতে পারেন।

দ্রষ্টব্য: আপনার কাছে প্রচুর ডেটা থাকলে প্রস্তাবিত নয় কারণ এটি প্রথমে সমস্ত সারি আনবে এবং তারপরে এলোমেলো মান প্রদান করবে।


61
একটি পারফরম্যান্স ভিত্তিক ডাউনসাইড হ'ল সমস্ত রেকর্ড পুনরুদ্ধার করা হয়।
গ্রাস ডাবল

3
এখানে সংগ্রহের বস্তুটিতে স্ক্যান্ড কোয়েরি নয় র্যান্ডম কল করা হয় is এলোমেলো ফাংশন পিএইচপি সাইডে
সঞ্চালিত হয়

@ এস্ট্রোয়ানু রাইট, তবে এই সংগ্রহটি জনপ্রিয় করতে, সমস্ত সারি জিজ্ঞাসা করা হয়েছে।
ধাতুফ্রোগ

1
আমি ভুল হতে পারি, তবে র্যান্ডম ফাংশনে পাস করা প্যারামিটার সংগ্রহের আকারের সমান হলে এটি কাজ করবে বলে মনে হয় না।
ব্রায়ান ব্যাটম্যান

এটি ভাল নয় ... আপনি সমস্ত রেকর্ড পুনরুদ্ধার করছেন এবং এলোমেলো একটি পেয়ে যাচ্ছেন। যদি আপনার টেবিলটিতে অনেকগুলি রেকর্ড থাকে তবে এটি আপনার অ্যাপ্লিকেশনটির জন্য খারাপ হতে পারে।
অ্যান্ডারসন সিলভা

34

tl; dr: আজকাল এটি লারাভেলে প্রয়োগ করা হয়েছে, নীচে "3 সম্পাদনা করুন" দেখুন।


দুঃখের বিষয়, আজকের মতো ->orderBy(DB::raw('RAND()'))প্রস্তাবিত সমাধান সহ কয়েকটি সতর্কতা রয়েছে :

  • এটি ডিবি-অজোনস্টিক নয়। যেমন SQLite এবং PostgreSQL ব্যবহারRANDOM()
  • আরও খারাপ, এই সমাধানটির পরে এই পরিবর্তনটি কার্যকর হয় না :

    $direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';


সম্পাদনা: এখন আপনি ব্যবহার করতে পারেন orderByRaw () পদ্ধতি: ->orderByRaw('RAND()')। তবে এটি এখনও ডিবি-অজোনস্টিক নয়।

এফডাব্লুআইডাব্লু, কোডআইগিনিটার একটি বিশেষ RANDOMবাছাই করার দিকনির্দেশ প্রয়োগ করে , যা ক্যোয়ারী তৈরি করার সময় সঠিক ব্যাকরণ দিয়ে প্রতিস্থাপন করা হয়। এছাড়াও এটি প্রয়োগ করা মোটামুটি সহজ বলে মনে হচ্ছে। দেখে মনে হচ্ছে লারাভেলকে উন্নত করার জন্য আমাদের কাছে প্রার্থী আছে :)

আপডেট: এখানে গিটহাবের বিষয়ে এই বিষয়টি এবং আমার মুলতুবি টানার অনুরোধ রয়েছে


সম্পাদনা 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 (যেহেতু পরিবর্তণের , : PR # 13642 ) আপনি নেটিভ পদ্ধতি ব্যবহার করতে পারেন inRandomOrder():

User::where('active', 1)->inRandomOrder()->limit(10)->get();

DB::table('users')->where('active', 1)->inRandomOrder()->limit(10)->get();

আপনার 5.1 ম্যাক্রোর নামটি র‌্যান্ডম অর্ডারতে পরিবর্তন করা উচিত যাতে এটি সামঞ্জস্যপূর্ণ;) বিশদ, বিবরণ :)
স্যান্ডার ভিজার

5.1 প্রকল্পটি 5.2-এ স্থানান্তরিত করার আগে প্রস্তুত করার সময় এটি একটি কাজ ছিল।
গ্রাস ডাবল

এটি এমন দুর্দান্ত উত্তর। আমি যদি উত্তরটির পক্ষে যেতে পারতাম তবে!
mwallisch

18

ইন Laravel 4 ও 5order_by দ্বারা প্রতিস্থাপিত হয়orderBy

সুতরাং, এটি হওয়া উচিত:

User::orderBy(DB::raw('RAND()'))->get();

ব্যবহারকারী :: orderBy (ডিবি :: কাঁচা ( 'এ এন ডি ()')) -> পেতে ();
দারিয়াস এম।

1
এটি ধন্যবাদ কাজ করে, কিন্তু আপনি কীভাবে এটি কাজ করে কিছু তথ্য দিতে পারেন?
আলেলি

আপনি কি আরও কিছু নির্দিষ্ট হতে পারেন? কি ধরণের তথ্য?
টিওডোর তালভ


9

লারাভেল 5.2> = এর জন্য

স্বতন্ত্র পদ্ধতি ব্যবহার করুন:

inRandomOrder()

InRandomOrder পদ্ধতিটি এলোমেলোভাবে ক্যোয়ারির ফলাফলগুলি সাজানোর জন্য ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, আপনি এলোমেলো ব্যবহারকারী আনার জন্য এই পদ্ধতিটি ব্যবহার করতে পারেন:

$randomUser = DB::table('users')
            ->inRandomOrder()
            ->first();

দস্তাবেজ থেকে: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset


কোর্সের :: inRandomOrder () -> নেওয়া (20) -> পেতে (); আমার জন্য কাজ করছে না - Find.php লাইন 219
এমজে

1
এটি মডেল কারখানাগুলির জন্য বা ডিবি বীজ বপনের জন্য দরকারী
সালেহ মাহমুদ

8

আপনি যেমন সাবলীল এবং স্বতঃস্ফূর্ত সাথে অর্ডার_বাই পদ্ধতিটি ব্যবহার করতে পারেন:

Posts::where_status(1)->order_by(DB::raw(''),DB::raw('RAND()')); 

এটি সামান্য বিচিত্র ব্যবহার, তবে কাজ করে।

সম্পাদনা: যেমনটি অ্যালেক্স বলেছেন, এই ব্যবহারটি পরিষ্কার এবং এটিও কাজ করে:

Posts::where_status(1)->order_by(DB::raw('RAND()'));

3
এটি পাশাপাশি কাজ করে এবং এটি একটু পরিচ্ছন্ন .. -> অর্ডার_বি (\ ডিবি :: কাঁচা ('র্যান্ড ()'))
অ্যালেক্স নাসপো


3

আপনি সহজেই এই আদেশটি ব্যবহার করতে পারেন:

// প্রশ্ন: মডেলটির নাম
// ডিবি থেকে 10 সারি নেবে শফল রেকর্ডে ...

$questions = Question::orderByRaw('RAND()')->take(10)->get();

3

আমি প্রথমে নির্দিষ্ট করতে বা ব্যর্থ করতে পছন্দ করি:

$collection = YourModelName::inRandomOrder()
  ->firstOrFail();

3

ফলাফলের ক্রমটি পরিবর্তন করতে লারাভেলের একটি অন্তর্নির্মিত পদ্ধতি রয়েছে।

এখানে ডকুমেন্টেশন থেকে একটি উদ্ধৃতি দেওয়া হয়েছে:

shuffle()

শিফল পদ্ধতিটি এলোমেলোভাবে সংগ্রহের আইটেমগুলিকে বদলে দেয়:

$collection = collect([1, 2, 3, 4, 5]);

$shuffled = $collection->shuffle();

$shuffled->all();

// [3, 2, 5, 1, 4] - (generated randomly)

আপনি এখানে ডকুমেন্টেশন দেখতে পারেন ।


2

আপনার মডেল এ এটি যোগ করুন:

public function scopeRandomize($query, $limit = 3, $exclude = [])
{
    $query = $query->whereRaw('RAND()<(SELECT ((?/COUNT(*))*10) FROM `products`)', [$limit])->orderByRaw('RAND()')->limit($limit);
    if (!empty($exclude)) {
        $query = $query->whereNotIn('id', $exclude);
    }
    return $query;
}

তারপরে রুট / কন্ট্রোলারে

$data = YourModel::randomize(8)->get();

2

রয়েছে whereRaw('RAND()')যা একই আছে করতে তারপর চেইন, আপনি ->get()বা ->first()এমনকি বা পাগল যান এবং যোগ ->paginate(int)


0

আমার হাজার হাজার রেকর্ড সহ টেবিল রয়েছে, তাই আমার দ্রুত কিছু দরকার need এটি সিউডো এলোমেলো সারিটির জন্য আমার কোড:

// count all rows with flag active = 1
$count = MyModel::where('active', '=', '1')->count(); 

// get random id
$random_id = rand(1, $count - 1);  

// get first record after random id
$data = MyModel::where('active', '=', '1')->where('id', '>', $random_id)->take(1)->first(); 

এর সাথে সমস্যাটি হ'ল আইডিসহ একাধিক সারি থাকলে এর মধ্যে $countকেবল প্রথমটি পুনরুদ্ধার করা যায় এবং তাই এটি অন্য যে কোনও সারির চেয়ে পুনরুদ্ধার হওয়ার সম্ভাবনাও বেশি।
কেমিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.