laravel - 从前 100 行中随机抽取 10 行

标签 laravel laravel-5 eloquent laravel-5.3

使用 Laravel Eloquent,如何从前 100 行中随机抽取 10 行(按日期排序)。

例如,我有这个:

$comments = Comment::orderBy('created_at', 'DESC')
    ->take(100)
    ->inRandomOrder()
    ->get();

如何更改此设置,以便从所选的 100 行中随机抽取 10 行?有没有办法做到这一点,这样我就不必检索 100 行?

最佳答案

1 - inRandomOrder() 非常慢,所以我不建议您使用它。

2 - take(100)->random() 解决方案将始终将 100 行放入内存,然后才会获得 10 个随机行。您提到当集合中只有 5 个项目时您会收到错误,因此请改用以下代码:

$comments = Comment::latest()->take(100)->get();
$count = $comments->count() > 9 ? 10 : $comments->count();
$random =  $comments->random($count);

3 - 如果此查询在您的应用程序中经常执行,我建议您创建附加列 sort 并使用计划任务更新此列。每天或几个小时将 1 到 100 个整数设置为 sort 列的值。将这些数字应用于表中最新的 100 行,其他行设置为 0。

然后您将能够通过快速查询获取最新的 radnom 10 行:

$comments = Comment::orderBy('sort')->take(10)->get();

它看起来像复杂的解决方案,但在高负载系统上它是最好的选择之一。

关于laravel - 从前 100 行中随机抽取 10 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40777417/

相关文章:

php - Laravel 中缺少 BC 数学或 GMP 扩展

mysql - 删除唯一的索引列

PhpSpreadsheet block 过滤器读取返回空行

php - 具有 Eloquent 关系的空对象模式

php - Laravel 5 更新返回旧关系

php - 在 Mac OS X Yosemite 10.10 上使用 Mamp Pro 的 Mcrypt

laravel - 如何将 Laravel Socialite 与 Laravel Spark 结合使用

Laravel Spark : CSRF Failure on Login Page

laravel - 带有连接的 yajra DataTable 在 laravel 5 中不起作用?

php - Laravel 模型 save() & update() 不保存