如何在Laravel框架中使用口才或流利来选择随机行?
我知道通过使用SQL,您可以通过RAND()进行订购。但是,我想让随机行without对初始查询之前的记录数进行计数。
有什么想法吗?
Laravel> = 5.2:
User::all()->random();
User::all()->random(10); // The amount of items you wish to receive
或
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();
检查this article在MySQL随机行上。 Laravel 5.2支持此功能,对于较旧的版本,没有更好的解决方案,然后使用RAW Queries。
edit 1:如Double Gras所述,由于this发生更改,orderBy()不允许ASC或DESC之外的任何其他内容。我相应地更新了答案。
edit 2: Laravel 5.2最终为此实现了a wrapper function。它称为inRandomOrder()。
您可以轻松使用此命令:
我的桌子上有成千上万条记录,所以我需要快速一些。这是我的伪随机行代码:
使用Laravel函数
我希望先指定还是失败:
这很好用,
$model=Model::all()->random(1)->first();
您还可以在随机函数中更改参数以获取多个记录。
注意:如果您有大量数据,不建议使用,因为这将首先获取所有行,然后返回随机值。
tl; dr:如今已在Laravel中实现,请参见下面的“编辑3”。
不幸的是,到目前为止,->orderBy(DB::raw('RAND()'))
建议的解决方案有一些警告:
RANDOM()
更糟糕的是,由于this change,此解决方案不再适用:
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
编辑:现在,您可以使用orderByRaw()方法:->orderByRaw('RAND()')
。但是,这仍然不是数据库不可知的。
FWIW,CodeIgniter实现了特殊的RANDOM
排序方向,在构建查询时将其替换为正确的语法。同样,它似乎很容易实现。看来我们有一个候选人可以改善Laravel:)
更新:这是有关GitHub上的issue,还有我的未决pull request。
编辑2:让我们开始追逐。从Laravel 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();
edit 3:最后!从Laravel 5.2.33(changelog,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
所以应该是:
User::orderBy(DB::raw('RAND()'))->get();
您可以使用
您还可以流畅而雄辩地使用order_by方法,例如:
对于Laravel 5.2> =
在您的模型上添加此:
还有whereRaw('RAND()')
的功能也一样,然后您可以链接->get()
或->first()
,甚至发疯并添加->paginate(int)
。