从前100名中随机抽取10行

时间:2016-11-24 03:01:15

标签: laravel laravel-5 eloquent laravel-5.3

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

例如,我有这个:

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

如何更改此选项,以便从所选的100行中随机输入10行?有没有办法做到这一点,我不必检索100行?

2 个答案:

答案 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);