从前 100 行中随机取 10 行

Take 10 random rows from the top 100

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

例如,我有这个:

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

我该如何更改它,以便从所选的 100 行中随机抽取 10 行?有没有办法让我不必检索 100 行?

您可以使用 random():

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

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 列的值。将这些数字应用于 table 中的最新 100 行,其他行设置为 0。

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

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

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