Laravel-雄辩或流利的随机行

问题描述 投票:214回答:13

如何在Laravel框架中使用口才或流利来选择随机行?

我知道通过使用SQL,您可以通过RAND()进行订购。但是,我想让随机行without对初始查询之前的记录数进行计数。

有什么想法吗?

php fluent laravel eloquent
13个回答
515
投票

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


2
投票

您可以轻松使用此命令:


0
投票

我的桌子上有成千上万条记录,所以我需要快速一些。这是我的伪随机行代码:


0
投票

使用Laravel函数


0
投票

我希望先指定还是失败:


47
投票

这很好用,

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

您还可以在随机函数中更改参数以获取多个记录。

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


32
投票

tl; dr:如今已在Laravel中实现,请参见下面的“编辑3”。


不幸的是,到目前为止,->orderBy(DB::raw('RAND()'))建议的解决方案有一些警告:

  • 不是与DB无关的。例如SQLite和PostgreSQL使用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(changelogPR #13642)开始,您可以使用本机方法inRandomOrder()

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

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

18
投票

Laravel 4和5]中,order_by替换为orderBy

所以应该是:

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

14
投票

您可以使用


8
投票

您还可以流畅而雄辩地使用order_by方法,例如:


8
投票

对于Laravel 5.2> =


2
投票

在您的模型上添加此:


2
投票

还有whereRaw('RAND()')的功能也一样,然后您可以链接->get()->first(),甚至发疯并添加->paginate(int)

© www.soinside.com 2019 - 2024. All rights reserved.