目前,我有很多的联接和子联接以及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页。
有什么办法解决这个问题吗?
答案 0 :(得分:0)
为您服务,将来的读者。从这种意义上来说我很幸运,我可以限制我的子连接-> limit(300)
现在,我可以使用分页了。现在一点也不慢了!
我对手动分页进行了测试,例如:
return $offersQuery->offset($this->offset)
->limit($this->perPage)
->get();
使用什么都没关系。