asArray()更省资源,它返回纯PHP关联数组,不创建ActiveRecord实例,跳过属性赋值、事件触发等ORM开销;toArray()需实例化模型并处理getter、关联等,开销大。

用 asArray() 更省资源。
asArray() 返回的是纯 PHP 关联数组(即二维索引/键名数组),不创建 ActiveRecord 对象实例,跳过了属性赋值、事件触发、关系加载、类型转换等 ORM 层开销。而 toArray() 必须先实例化模型对象,再逐字段调用 attributes、遍历 extraFields、递归处理关联数据,内存占用和 CPU 消耗明显更高。
导出场景中,你只需要把数据库字段原样转成数组结构供 JSON 序列化或写入 Excel,不需要模型行为、验证逻辑或延迟加载能力。此时 asArray() 是更直接、轻量、可控的选择。
- ✅
asArray():零对象实例化,字段直取,适合大批量只读导出 - ❌
toArray():触发完整模型生命周期,含 getter、virtual attributes、relations,默认会加载关联表(除非显式关闭)
补充两个实用建议:
- 查询时配合
select()明确字段,避免SELECT *带来冗余列 - 大数据量下别一次性
all(),改用each($batchSize)或batch($batchSize)流式获取,防止内存溢出
例如:
$query = Order::find()->select(['id', 'order_no', 'created_at', 'amount']);
foreach ($query->asArray()->batch(500) as $rows) {
foreach ($rows as $row) {
// 写入 CSV / Excel / JSON 流
}
}


















