Yii2 GridView分页异常:过滤模型后分页消失如何解决?
解决Yii ActiveDataProvider过滤后分页链接消失的问题
我来帮你梳理问题根源并给出修复方案:
问题核心原因
你当前的写法存在几个关键错误,导致分页失效:
- 直接用
unset($models[$k])删除元素后,数组索引会变得不连续,这会让DataProvider在处理模型时出现异常 - 硬编码
totalCount为5214完全不符合实际,过滤后的总数据量应该是筛选后剩余模型的数量,而非原查询的总数 - 调用
setPagination($config)时传入的是数组,但该方法要求接收yii\data\Pagination实例,不是普通关联数组
修复步骤与代码示例
1. 正确处理过滤后的模型数组
用更简洁可靠的方式过滤并重新索引数组,避免索引断裂:
$models = $data_provider->models; // 过滤掉employ为null的模型 $filteredModels = array_filter($models, function ($model) { return $model->employ !== null; }); // 重新索引数组,确保索引连续 $filteredModels = array_values($filteredModels);
2. 重新配置分页并手动处理分页切片
因为是在获取全部模型后再过滤,需要手动对过滤后的数组做分页处理,同时正确初始化Pagination实例:
// 创建正确的分页实例,设置过滤后的总数量 $pagination = new \yii\data\Pagination([ 'pageParam' => 'page', 'pageSizeParam' => 'per-page', 'forcePageParam' => true, 'totalCount' => count($filteredModels), // 关键:使用过滤后的实际总数 'defaultPageSize' => 20, 'pageSizeLimit' => [1, 50], // 注意这里是[最小值, 最大值],不是键值对 ]); // 根据当前分页参数,从过滤后的数组中截取对应页的模型 $pageModels = array_slice($filteredModels, $pagination->offset, $pagination->limit);
3. 更新DataProvider并返回视图
把处理后的模型和分页实例赋值给DataProvider:
$data_provider->setModels($pageModels); $data_provider->setPagination($pagination); return $this->render('all-staff',[ 'dataProvider' => $data_provider, 'searchModel' => $search_model ]);
额外优化建议
如果你的过滤逻辑可以通过SQL实现(比如employ IS NOT NULL),强烈建议直接在StaffEmploymentListViewSearch的search方法中添加查询条件,这样性能更优,也不需要手动处理分页:
// 在search方法的$query中添加条件 $query->andWhere(['IS NOT', 'employ', null]);
内容的提问来源于stack exchange,提问作者rufusy
相关产品推荐
相关产品推荐

