You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:43:11