在L-4中很简单:
$random_quote = Quotation::all()->random(1);
但是现在在L-5中,没有一篇文章中描述的方法有效: Laravel - Eloquent or Fluent random row
我的视图文件只是空白。有什么想法吗?
编辑:
解决: $ random_quote = Quotation :: orderByRaw(“RAND()”) - > first();
答案 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()')有两个问题:
这是我使用的解决方案,似乎更好一点:
$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的新集合实例。如果没有提供参数,此方法将只返回一个对象。