【问题标题】:Laravel - How to manual paginate but with max number of total count?Laravel - 如何手动分页但总计数最大?
【发布时间】:2019-01-07 20:40:31
【问题描述】:

目前,我有很多使用 Group By 等的 Join 和 SubJoins。

简而言之:我不能使用分页,因为它太慢了(因为 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 页。

知道如何解决这个问题吗?

【问题讨论】:

  • "这种当前的方法比使用分页要快得多。" - 这似乎是倒退的,因为使用分页,您只获取您需要的结果集,而不是 300 多条记录,然后手动切片记录。除非您的连接等与COUNT() 查询发生冲突(分页将执行两个查询:计算所有记录,然后限制/偏移当前页面)。我建议发布您的实际查询,看看是否可以优化。
  • 早上好@AkenRoberts,抱歉回复晚了。我将添加 sql 查询。使用调试栏我看到COUNT() 的查询大约需要 1.68 秒......在我使用分页之前,整个 ajax 请求只用了大约 0.75 秒......

标签: laravel


【解决方案1】:

只为你,未来的读者。从这个意义上说,我很幸运,我可以限制我的子连接 ->limit(300)

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

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

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

你要使用什么并不重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 2017-11-26
    • 1970-01-01
    • 2016-01-26
    • 2014-01-13
    • 2015-05-09
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多