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

如何在Yii2中使用kartik-export组件处理数组格式模型数据

问题:Yii2 Kartik ExportMenu无法使用数组数据,报错Call to a member function getModels() on array

我在控制器里写了这段查询代码,直接返回数组格式的查询结果:

$dataPendaftar = Pendaftar::find() 
    ->select(['pendaftar.*','user.*']) 
    ->from('pendaftar') 
    ->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar') 
    ->asArray() 
    ->all(); 
return $this->render('index', [ 
    'dataPendaftar' => $dataPendaftar, 
]);

然后在视图里尝试用Kartik的yii2-export组件的ExportMenu小部件:

$gridColumns= [ 
    'nik_pendaftar', 
    'tanggal_lahir', 
    'email', 
]; 
echo ExportMenu::widget([ 
    'dataProvider' => $dataPendaftar, 
    'columns' => $gridColumns, 
    'fontAwesome' => true, 
]);

结果触发了错误:

Call to a member function getModels() on array

想问问能不能用数组格式的模型数据替代dataProvider来使用这个导出组件?


解答

当然可以,但得先搞清楚为啥报错:ExportMenu的dataProvider参数要求的是实现了yii\data\DataProviderInterface的实例(比如ActiveDataProvider),而不是直接传数组——它内部会调用getModels()方法来获取数据,数组自然没有这个方法,所以才会报错。

这里给你两种可行的解决思路:

方法1:改用ActiveDataProvider(推荐)

既然你已经有AR查询了,直接把查询对象传给ActiveDataProvider就行,不用手动转数组,ExportMenu能完美兼容:

控制器修改:

$query = Pendaftar::find()
    ->select(['pendaftar.*','user.*'])
    ->from('pendaftar')
    ->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar');

$dataProvider = new \yii\data\ActiveDataProvider([
    'query' => $query,
    // 如果需要分页或排序,这里可以配置,比如:
    // 'pagination' => ['pageSize' => 20],
]);

return $this->render('index', [
    'dataProvider' => $dataProvider,
]);

视图修改:

直接把dataProvider传进去就行,不用改columns:

$gridColumns= [ 
    'nik_pendaftar', 
    'tanggal_lahir', 
    'email', 
]; 
echo ExportMenu::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => $gridColumns, 
    'fontAwesome' => true, 
]);

这种方式更符合Yii2的最佳实践,还能顺便用上分页、排序这些功能,推荐优先用这个。

方法2:把数组转成ArrayDataProvider(如果一定要用数组的话)

如果你因为某些原因必须用数组数据,那可以把数组包装成ArrayDataProvider实例,它同样实现了DataProvider接口,ExportMenu能识别:

控制器修改(如果还是要返回数组的话):

$dataPendaftar = Pendaftar::find() 
    ->select(['pendaftar.*','user.*']) 
    ->from('pendaftar') 
    ->leftJoin('user', 'user.id=pendaftar.id_user_pendaftar') 
    ->asArray() 
    ->all(); 

// 把数组包装成ArrayDataProvider
$dataProvider = new \yii\data\ArrayDataProvider([
    'allModels' => $dataPendaftar,
    // 可选:配置分页或排序
    // 'pagination' => ['pageSize' => 10],
]);

return $this->render('index', [ 
    'dataProvider' => $dataProvider, 
]);

视图代码不变:

还是原来的ExportMenu代码,直接传dataProvider就行。

两种方法都能解决你的报错问题,建议优先用第一种,更贴合Yii2的设计思路~

内容的提问来源于stack exchange,提问作者eniac05

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:35:54