使用Laravel Eloquent,如何从前100名中取10个随机行(按日期排序)。
例如,我有这个:
$comments = Comment::orderBy('created_at', 'DESC')
->take(100)
->inRandomOrder()
->get();
如何更改此选项,以便从所选的100行中随机输入10行?有没有办法做到这一点,我不必检索100行?
答案 0 :(得分:2)
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。
然后,您将能够通过快速查询获得最新的10行Radnom:
$comments = Comment::orderBy('sort')->take(10)->get();
它看起来像复杂的解决方案,但在高负载系统上,它是最好的选择之一。
答案 1 :(得分:0)
您可以使用random()
:
$comments = Comment::orderBy('created_at', 'DESC')
->take(100)
->get()
->random(10);