41

在 L-4 中很简单:

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

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

我的视图文件只是空白。

4

10 回答 10

47

这些作品,但可能你没有使用 right 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();
于 2014-11-17T23:07:11.950 回答
31

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

它适用于 Eloquent

Model::inRandomOrder()->first()
于 2016-07-16T08:52:46.700 回答
26

Laravel 5.4 更新

Laravel 5.4 中的新随机排序 ->inRandomOrder()->first()

于 2017-02-26T10:18:45.310 回答
14

Laravel 5.3 更新

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

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

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

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

The 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);

Et voila - 快乐的编码!当你看到它时投票给它,这样它就会在页面上出现:)

于 2015-10-14T10:12:50.380 回答
12

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

  1. 它依赖于 MySQL 服务器
  2. 在大表上可能会很慢(获取所有行)

这是我使用的解决方案,似乎更好一些:

$cnt = $records->count();
if ($cnt == 0)
    return;

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

编辑:请注意,如果在“count()”和“skip()”之间删除了一些记录,我的解决方案可能会出现问题(如果没有运气,则会崩溃)。

于 2015-08-26T08:30:19.817 回答
8

使用Benjamin 的想法,我会以不同的方式实现这一点。一个Query Scope感觉很合适,所以它是可重用的,它属于你正常的 Eloquent 使用。

注意: 在 Eloquent 5.2 中,内置了对全局作用域的支持。

我将创建一个模型可以利用的特征,但是您可以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/报价.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Quotation extends Model
{
    use GlobalScopes;

    //...
}

正在使用:

$randomQuote = \Quotation::random()->first();
于 2015-11-14T06:56:23.447 回答
5

在 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);

应该可以正常工作。

于 2016-01-28T11:24:23.113 回答
3

拉拉维尔 5.4

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

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

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

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

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

文档参考:https ://laravel.com/docs/5.4/collections#method-random

于 2017-05-06T08:27:11.500 回答
2
orderByRaw('RAND()')

注意:它将从查询的其余部分中取出所有行,因此,如果您有一个大表而在同一查询中没有其他过滤器,则性能会很差,否则这是您的选择

于 2016-03-04T10:10:24.723 回答
0

您可以使用random()从集合中返回随机项”的方法:

Product::where('city_id', $discount->product->city)
        ->get()
        ->random(1);
于 2021-10-06T13:38:04.147 回答