怎么得到随机行laravel-5

时间:2014-11-17 22:28:39

标签: random eloquent laravel-5

在L-4中很简单:

$random_quote = Quotation::all()->random(1);

但是现在在L-5中,没有一篇文章中描述的方法有效: Laravel - Eloquent or Fluent random row

我的视图文件只是空白。有什么想法吗?

编辑:

解决: $ random_quote = Quotation :: orderByRaw(“RAND()”) - > first();

9 个答案:

答案 0 :(得分:40)

这些可行,但您可能没有使用正确的namespace,只需使用use名称顶部的class语句,如下所示:

<?php namespace SomeNamespace;

use App\Quotation; // Says "Quotation.php" is in "App" folder (By default in L-5.0)

class someClass {
    //...
}

然后你可以使用method这样的东西:

// You may add: use DB; at the top to use DB instead of \DB
$random_quote = Quotation::orderBy(\DB::raw('RAND()'))->first();

或者这个:

$random_quote = Quotation::orderByRaw("RAND()")->first();

更新(自Laravel-5.2起):

$random_quote = Quotation::inRandomOrder()->first();

答案 1 :(得分:27)

random()在5.2中给出了错误,因此您可以使用inRandomOrder https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset

它可以像Eloquent一样工作

Model::inRandomOrder()->first()

答案 2 :(得分:16)

Laravel 5.4的更新

New randomsorting in Laravel 5.4 ->inRandomOrder()->first()

答案 3 :(得分:12)

orderByRaw('RAND()')有两个问题:

  1. 依赖于MySQL服务器
  2. 在大型表格上可能会很慢(提取所有行)
  3. 这是我使用的解决方案,似乎更好一点:

    $cnt = $records->count();
    if ($cnt == 0)
        return;
    
    $randIndex = rand(0, $cnt-1);
    $obj = $records->skip($randIndex)->take(1)->first();
    

    编辑:请注意,如果在“count()”和“skip()”之间删除了一些记录,那么在对数据库进行并行请求的情况下,我的解决方案可能会出现问题(如果没有运气则会崩溃)。 / p>

答案 4 :(得分:11)

更新LARAVEL 5.3

我很高兴发现这是一个原生查询功能! :d

inRandomOrder方法可用于随机对查询结果进行排序。例如,您可以使用此方法来获取随机用户:

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

不幸的是,这些答案都没有充分利用Laravel 5的系列。如果你像我一样从Google来到这里寻找完全原生的解决方案,请看下面的内容!

Alpha的答案有数据库依赖性缺陷,正如他所指出的那样,本杰明可能会在中间删除行时出现问题。极不可能,但仍有可能。

这是一个在Laravel 5 +

中选择随机行的单行解决方案
// The setup
$numberOfRows = 4;
$models = Model::all(); // or use a ::where()->get();

// And the actual randomisation line
$randRows = $models->shuffle()->slice(0,numberOfRows);

Et瞧 - 快乐的编码!当你看到它时投票,它会在页面上升起:)

答案 5 :(得分:8)

我使用Benjamin's idea以不同的方式实现这一点。 Query Scope对此感觉合适,因此它可以重复使用,并且会影响您正常的雄辩使用。

注意: In Eloquent 5.2, there is built in support for global scopes.

我要创建模型可以使用的特征,但您可以直接将scopeRandom方法添加到特定模型中。

<强> /app/GlobalScopes.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

trait GlobalScopes
{
    public function scopeRandom($query){
        $totalRows = static::count() - 1;
        $skip = $totalRows > 0 ? mt_rand(0, $totalRows) : 0;

        return  $query->skip($skip)->take(1);
    }
}

然后,要使用全局范围的每个模型,在类中命名特征。

<强> /app/Quotation.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Quotation extends Model
{
    use GlobalScopes;

    //...
}

使用中:

$randomQuote = \Quotation::random()->first();

答案 6 :(得分:3)

在Laravel 5.1(和Laravel 5.2)中,Eloquent构建器返回的random类中有一个Collection方法。

https://laravel.com/docs/5.1/collections#available-methods

所以你的电话

$random_quote = Quotation::all()->random(1);

$random_quote = Quotation::where('column', 'value')->get()->random(1);

应该正常工作。

答案 7 :(得分:1)

orderByRaw('RAND()')

注意:它会占用查询其余部分的所有行,所以如果你有一个大表,而不是同一个查询中的其他过滤器,它会给出不好的表现,否则这是你的选择

答案 8 :(得分:1)

Laravel 5.4

1)如果需要一个随机模型:

$object = Model::all()->random();

2)如果需要很多随机模型:

$object = Model::all()->random($n); //$n - number of elements
                                    //$object - collection

注释:调用$ collection-&gt; random(1)现在将返回一个带有一个item的新集合实例。如果没有提供参数,此方法将只返回一个对象。

文件编号:https://laravel.com/docs/5.4/collections#method-random