在 L-4 中很简单:
$random_quote = Quotation::all()->random(1);
但是现在在 L-5 中,这篇文章中描述的方法没有一个有效: Laravel - Eloquent or Fluent random row
我的视图文件只是空白。
在 L-4 中很简单:
$random_quote = Quotation::all()->random(1);
但是现在在 L-5 中,这篇文章中描述的方法没有一个有效: Laravel - Eloquent or Fluent random row
我的视图文件只是空白。
这些作品,但可能你没有使用 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();
random()
在 5.2 中给出错误,因此您可以使用inRandomOrder
https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset,
它适用于 Eloquent
Model::inRandomOrder()->first()
Laravel 5.4 更新
Laravel 5.4 中的新随机排序
->inRandomOrder()->first()
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 - 快乐的编码!当你看到它时投票给它,这样它就会在页面上出现:)
orderByRaw('RAND()') 有两个问题:
这是我使用的解决方案,似乎更好一些:
$cnt = $records->count();
if ($cnt == 0)
return;
$randIndex = rand(0, $cnt-1);
$obj = $records->skip($randIndex)->take(1)->first();
编辑:请注意,如果在“count()”和“skip()”之间删除了一些记录,我的解决方案可能会出现问题(如果没有运气,则会崩溃)。
使用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();
在 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);
应该可以正常工作。
拉拉维尔 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
orderByRaw('RAND()')
注意:它将从查询的其余部分中取出所有行,因此,如果您有一个大表而在同一查询中没有其他过滤器,则性能会很差,否则这是您的选择
您可以使用random()
“从集合中返回随机项”的方法:
Product::where('city_id', $discount->product->city)
->get()
->random(1);