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实现了一个特殊的RANDOM
sorting方向,在构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_by
被orderBy
replace
所以,它应该是:
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();