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

使用ExportMenu组件时,能否将ArrayDataProvider转换为ActiveDataProvider?

将ArrayDataProvider转换为ActiveDataProvider以适配ExportMenu组件

可以转换,需根据数据来源选择对应方式

情况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:

  1. 遍历数组,创建对应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;
}
  1. 构造ActiveDataProvider并注入模型:
$activeProvider = new ActiveDataProvider([
    'query' => User::find(), // 传入模型的空查询作为占位
]);
// 手动设置模型集合和总数量
$activeProvider->setModels($models);
$activeProvider->setTotalCount(count($models));

注意事项

  • 如果需要分页、排序功能,需确保ActiveDataProvider的分页、排序配置与原ArrayDataProvider一致,或根据需求调整。
  • 确保目标AR模型已正确定义对应字段的属性、标签(ExportMenu会用到这些信息生成导出内容)。

内容的提问来源于stack exchange,提问作者Alessandro Pio Budetti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:30:06