Search code examples
phplaravelrandomeloquentfluent

Laravel - Eloquent or Fluent random row


How can I select a random row using Eloquent or Fluent in Laravel framework?

I know that by using SQL, you can do order by RAND(). However, I would like to get the random row without doing a count on the number of records prior to the initial query.

Any ideas?


Solution

  • Laravel >= 5.2:

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

    or to get the specific number of records

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

    or using the random method for collections:

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

    Laravel 4.2.7 - 5.1:

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

    Laravel 4.0 - 4.2.6:

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

    Laravel 3:

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

    Check this article on MySQL random rows. Laravel 5.2 supports this, for older version, there is no better solution then using RAW Queries.

    edit 1: As mentioned by Double Gras, orderBy() doesn't allow anything else then ASC or DESC since this change. I updated my answer accordingly.

    edit 2: Laravel 5.2 finally implements a wrapper function for this. It's called inRandomOrder().