Random 如何获得随机行laravel-5

Random 如何获得随机行laravel-5,random,eloquent,laravel-5,Random,Eloquent,Laravel 5,在L-4中,它很简单: $random_quote = Quotation::all()->random(1); 但现在在L-5中,这篇文章中描述的任何一种方法都不起作用: 我的视图文件变为空白。有什么想法吗 编辑: 已解决: $random_quote=quote::orderByRaw(“RAND()”)->first() 这些方法有效,但您可能没有使用正确的名称空间,只需使用类名称顶部的use语句,如下所示: orderByRaw('RAND()')有两个问题: 它依赖于MySQ

在L-4中,它很简单:

$random_quote = Quotation::all()->random(1);
但现在在L-5中,这篇文章中描述的任何一种方法都不起作用:

我的视图文件变为空白。有什么想法吗

编辑:

已解决:
$random_quote=quote::orderByRaw(“RAND()”)->first()

这些方法有效,但您可能没有使用正确的
名称空间
,只需使用
名称顶部的
use
语句,如下所示:

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

  • 它依赖于MySQL服务器
  • 在大型表上速度可能较慢(获取所有行)
  • 以下是我使用的解决方案,似乎更好一些:

    $cnt = $records->count();
    if ($cnt == 0)
        return;
    
    $randIndex = rand(0, $cnt-1);
    $obj = $records->skip($randIndex)->take(1)->first();
    
    编辑:请注意,如果在“count()”和“skip()”之间删除了一些记录,则我的解决方案可能会在对数据库的并行请求中出现问题(如果运气不好,则崩溃)。

    更新LARAVEL 5.3

    我很高兴发现这是一个本机查询函数!:D

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

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

    不幸的是,所有这些答案都没有充分利用Laravel 5的收藏。如果你像我一样从谷歌来到这里,寻找一个完全本地的解决方案,请看下面

    Alpha的答案有数据库依赖性缺陷,而Benjamin指出,当删除中间的行时,可能会造成问题。可能性很小,但仍有可能

    这里有一个单行的解决方案来选择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);
    

    等瞧,快乐的编码!当你看到它时,请投票,这样它就会出现在页面上:)

    我会用不同的方式实现它,使用。A因为这感觉很合适,所以它是可重用的,并且它属于您的正常雄辩使用

    注意:

    我将创建一个模型可以利用的特性,但是您可以直接将
    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);
        }
    }
    
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Quotation extends Model
    {
        use GlobalScopes;
    
        //...
    }
    
    在Laravel5.1(和Laravel5.2)中,雄辩的构建器返回的
    集合
    类中有一个
    随机
    方法

    那你的电话呢

    应该能正常工作

    orderByRaw('RAND()')
    
    注意:它将从查询的其余部分中获取所有行的ram,因此,如果在同一查询中有一个没有其他筛选器的大表,它将提供较差的性能,否则这是您的选项

    random()
    在5.2中给出错误,因此您可以使用
    在随机顺序中

    它对雄辩的人起作用

    Model::inRandomOrder()->first()
    
    Laravel 5.4的更新

    ->inRandomOrder()->first()

    Laravel 5.4

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

    $object = Model::all()->random();
    
    2) 如果需要许多随机模型:

    $object = Model::all()->random($n); //$n - number of elements
                                        //$object - collection
    
    注释:调用$collection->random(1)将返回一个包含一个项的新集合实例。如果没有提供参数,此方法将只返回一个对象


    Doc ref:

    您尝试过什么代码?它是有效的,也许你错过了一些东西。顺便说一句,这在性能方面真的很糟糕。你能分享一个性能方面的方法吗?我有c。数据库中有30000句名言…我们应该先放()而不是get(),我正在打印字符串,变量是一个数组。这就是为什么视图是空的。
    orderbyrand()
    实际上非常慢,我的意思是非常非常,真慢。我开始注意到,即使是在一个有400行的表上,也会有不同之处。::inRandomOrder()仍然解析为“ORDER BY RAND()”。
    $objects=Model::inRandomOrder()->first()是最干净的方式!虽然这肯定会奏效,但当您只需要一行时,获取一个表的所有结果是过分的。如果您有非常大的表,它会大大降低性能。只需使用->take(100)?您将只得到前100行中的一个随机行!好吧,说得好!首先执行->count(),然后生成一个介于1和$count之间的随机整数,然后将其用于::find()-问题已解决,对吗?假设您有500行。您可以选择一个记录:mt_rand(1500),然后使用find。报价单::查找(15)。如果id为15的行已被删除怎么办?所以你知道你有500行,但你不知道的是,是否有一条记录与1到500之间的每个id相关联。聪明的解决方案和此页面上的最佳Laravel特定答案。现在这应该是公认的答案。它不是特定于数据库的,并且利用了框架功能+1
    $r=quote::all()->random(1)确实有效,但它首先执行一个
    select*from quotes
    命令,该命令。。。如果有很多引文,可能会很慢…这确实帮助了我,但我有一个问题,我只想在页面上显示引文和作者(正在发生),但与每个引文相关的id也出现了,我如何排除id?从我的观点来看,这是正确的答案。其他方法也可以,但即使使用Laravel6.x,它也是有文档记录的方法
    orderByRaw('RAND()')
    
    Model::inRandomOrder()->first()
    
    $object = Model::all()->random();
    
    $object = Model::all()->random($n); //$n - number of elements
                                        //$object - collection