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