从前 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();
这看起来是个复杂的解决方案,但在高负载系统上它是最佳选择之一。
使用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();
这看起来是个复杂的解决方案,但在高负载系统上它是最佳选择之一。