Laravel Nova如何展示百万级行资源?单资源禁用COUNT(*)分页统计
解决Laravel Nova大表COUNT(*)超时问题(仅针对特定资源)
针对500万行的InnoDB表,Laravel Nova默认分页时执行的count(*)查询会超时,要仅禁用该资源的统计行为、保留上下页分页,直接改用simplePaginate即可——它不会触发总条数统计查询。
具体实现步骤
在对应的Nova资源类(比如App\Nova\QueueArticle.php)中添加以下方法:
/** * 设置资源的分页选项 * * @param \Illuminate\Http\Request $request * @return array */ protected function paginationOptions(Request $request) { return [ 'perPage' => $this->perPageOptions()[0], // 沿用默认的每页条数 'simple' => true, // 启用简单分页(不统计总条数) ]; }
或者也可以通过重写索引查询的方式强制启用简单分页:
/** * 构建索引页的查询逻辑 * * @param \Illuminate\Http\Request $request * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public static function indexQuery(Request $request, $query) { $query = parent::indexQuery($request, $query); // 告诉Nova使用简单分页 $request->merge(['simple_pagination' => true]); return $query; }
效果说明
修改后,该资源的Nova索引页会:
- 不再执行
select count(*) as aggregate from queue_articles查询,彻底解决超时问题 - 分页控件仅显示「上一页」「下一页」按钮,不再展示总页数、当前页位置等依赖总条数的内容
- 正常加载展示资源数据,满足索引页的基本使用需求
内容的提问来源于stack exchange,提问作者Michael Love
相关产品推荐
相关产品推荐

