Laravel-如何手动分页但总计数最大?

时间:2019-01-04 22:43:43

标签: laravel

目前,我有很多的联接和子联接以及Group By等。

简而言之:我不能使用分页,因为它太慢了(因为分组依据)。这就是为什么我需要手动使用分页的原因,但是,我还需要限制行的总数。行数超过10k时,我希望最多有300个!

我当前的方法效果欠佳,我真的不知道如何解决它:

return \DB::table('offers')
           ->alotOfQueries/joins
           ->...
           ->limit(300) //we show only a maximum of 300 offers
           ->get();

返回后,我正在手动创建分页。

我也将代码留在这里:

protected function paginate(Collection $offerings): LengthAwarePaginator
{
    $page = request()->page ?? 1;

    $perPage = $this->config->take;

    $offset = ($page * $perPage) - $perPage;

    return new LengthAwarePaginator(
        array_slice($offerings->all(), $offset, $perPage, true),
        $offerings->count(), 
        $perPage, 
        $page,
        [
            'path' => request()->url(),
            'query' => request()->query()
        ]
    );
}

这种当前方法比使用分页法要快得多。

但是我的问题是,它仍在加载300行。

我的目标是每页仅加载18行。并计算正确的总数,直到达到300。它不会超过该值。

数字取自Airbnb,所以我可以给你看这张照片,这样你也许知道我在追求什么:

Airbnb始终将其最大总数限制为300。由于加载了18行,因此我们获得了17页。

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

为您服务,将来的读者。从这种意义上来说我很幸运,我可以限制我的子连接-> limit(300)

现在,我可以使用分页了。现在一点也不慢了!

我对手动分页进行了测试,例如:

return $offersQuery->offset($this->offset)
                           ->limit($this->perPage)
                           ->get();

使用什么都没关系。