调用 asarray() 后分页对象仍为 activedataprovider,仅 getmodels() 返回数组,pagination 和 totalcount 等分页功能完全正常。

用 asArray() 后,分页对象(ActiveDataProvider)本身**并不丢失**,只是查询结果(即数据项)变成了数组格式——这完全不影响分页逻辑的运行。
分页对象仍是 ActiveDataProvider,和 asArray 无关
ActiveDataProvider 的分页能力(总条数、当前页、每页数量、分页链接等)依赖的是它内部的 query 和 pagination 配置,而不是结果是否是模型对象。调用 asArray() 是在 query 层级设置的,只影响 getModels() 返回的数据结构。
-
$dataProvider->getModels()返回数组(不是 AR 对象) -
$dataProvider->getPagination()->getPageCount()照常可用 -
$dataProvider->getTotalCount()依然准确(只要没手动禁用totalCount) -
$dataProvider->getPagination()->getPage()、getPageSize()全部正常
正确写法示例(关键:asArray 要设在 query 上,不是 dataProvider 上)
✅ 正确:
$query = Article::find()->where(['status' => 1]); $query->asArray(); // ← 在 query 上设 <p>$dataProvider = new ActiveDataProvider([ 'query' => $query, 'pagination' => [ 'pageSize' => 20, ], ]); // 此时 $dataProvider->getModels() 返回数组,但分页信息完整 </p>
❌ 错误(无效):
// $dataProvider->asArray() 不存在!这是常见误解 $dataProvider->asArray(); // PHP Fatal Error
模板中使用(数组 + 分页控件)
在视图里照常用:
<?php foreach ($dataProvider->getModels() as $row): ?>
<div>= $row['title'] ?></div>
<?php endforeach; ?><p>= \yii\widgets\LinkPager::widget(['dataProvider' => $dataProvider]) ?>
<!-- LinkPager 自动读取 pagination 和 totalCount,完全兼容 asArray -->
</p>
注意 totalCount 性能问题(尤其大数据量)
如果加了复杂 JOIN 或 WHERE,getTotalCount() 默认会生成 COUNT(*) 查询,可能慢。可手动优化:
- 用
'totalCount' => $query->count()提前算好(适合条件固定) - 或用
'totalCount' => Yii::$app->cache->get('article_count')缓存总数 - 或设置
'pagination' => ['forcePageParam' => false]配合前端分页(不推荐默认启用)











