Laravel – 雄辩或stream利的随机排

如何在Laravel框架中使用Eloquent或Fluent来select一个随机行?

我知道,通过使用SQL,您可以通过RAND()进行sorting。 但是,我想在初始查询之前, 计算logging的数量获得随机行。

有任何想法吗?

Laravel> = 5.2:

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

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(); 

检查这篇关于MySQL随机行的文章 。 Laravel 5.2支持这一点,对于旧版本,没有更好的解决scheme,然后使用RAW查询 。

编辑1:正如Double Gras提到的,orderBy()不允许任何其他的ASC或DESC,因为这个改变。 我相应地更新了我的答案。

编辑2: Laravel 5.2终于实现了一个包装函数 。 它被称为inRandomOrder()

这工作得很好,

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

您也可以在随机函数中更改参数以获取多条logging。

注意:如果您有大量数据,不build议这样做,因为这将首先获取所有行,然后返回随机值。

可悲的是,截至今天,有一些注意事项->orderBy(DB::raw('RAND()'))提出的解决scheme:

  • 这不是DB不可知的。 例如SQLite和PostgreSQL使用RANDOM()
  • 更糟的是,这个解决scheme不再适用,因为这个变化 :

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

编辑:现在你可以使用orderByRaw()方法: ->orderByRaw('RAND()') 。 但是,这仍然不是DB不可知的。

FWIW,CodeIgniter实现了一个特殊的RANDOMsorting方向,在构build查询时用正确的语法replace。 而且这似乎相当容易实施。 看起来我们有一个提高Laravel的候选人:)

更新:这是GitHub上的这个问题 ,以及我的挂起请求 。

编辑2:让我们削减追逐。 由于Laravel 5.1.18可以将macros添加到查询生成器中:

 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(); 

Laravel 4和5中order_byorderByreplace

所以,它应该是:

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

你也可以使用order_by方法,如下所示:

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

这是一个有点奇怪的用法,但工程。

编辑:正如@亚历克斯说,这个用法更清洁,也适用:

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

对于Laravel 5.2> =

使用Eloquent方法:

 inRandomOrder() 

inRandomOrder方法可以用来随机sorting查询结果。 例如,你可以使用这个方法来获取一个随机的用户:

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

从文档: https : //laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

在你的模型添加这个:

 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(); 

你可以链接->get()->first()或甚至疯狂并添加->paginate(int)

我有成千上万的logging,所以我需要快速的东西。 这是我的伪随机行代码:

 // 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(); 

你可以很容易的使用这个命令//问题:模型的名称//从数据库中取10行在随机logging中…

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

您可以使用:

 ModelName::inRandomOrder()->first();