使用ExportMenu组件时,能否将ArrayDataProvider转换为ActiveDataProvider?
可以转换,需根据数据来源选择对应方式
情况1:数组数据直接来自ActiveRecord查询
如果你的ArrayDataProvider是基于ActiveRecord的asArray()查询结果(比如User::find()->asArray()->all()),直接替换为ActiveDataProvider即可,无需额外转换:
// 原ArrayDataProvider写法 // $arrayProvider = new ArrayDataProvider([ // 'allModels' => User::find()->asArray()->all(), // ]); // 替换为ActiveDataProvider $activeProvider = new ActiveDataProvider([ 'query' => User::find(), // 保留原有的分页、排序配置 'pagination' => [ 'pageSize' => 20, ], 'sort' => [ 'defaultOrder' => ['id' => SORT_DESC], ], ]);
情况2:数组数据为自定义结构(与某ActiveRecord模型匹配)
如果数组是手动构造或来自非AR数据源,但字段结构和某个ActiveRecord模型一致,可以将数组转换为AR实例集合,再注入ActiveDataProvider:
- 遍历数组,创建对应AR模型实例并赋值:
// 自定义数组数据 $arrayData = [ ['id' => 1, 'name' => '张三', 'email' => 'zhangsan@example.com'], ['id' => 2, 'name' => '李四', 'email' => 'lisi@example.com'], ]; // 转换为AR模型实例 $models = []; foreach ($arrayData as $data) { $model = new User(); // 替换为你的目标AR模型类 $model->setAttributes($data, false); // false跳过验证,直接赋值属性 $models[] = $model; }
- 构造ActiveDataProvider并注入模型:
$activeProvider = new ActiveDataProvider([ 'query' => User::find(), // 传入模型的空查询作为占位 ]); // 手动设置模型集合和总数量 $activeProvider->setModels($models); $activeProvider->setTotalCount(count($models));
注意事项
- 如果需要分页、排序功能,需确保
ActiveDataProvider的分页、排序配置与原ArrayDataProvider一致,或根据需求调整。 - 确保目标AR模型已正确定义对应字段的属性、标签(ExportMenu会用到这些信息生成导出内容)。
内容的提问来源于stack exchange,提问作者Alessandro Pio Budetti
相关产品推荐
相关产品推荐

