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

Yii2 ActiveRecord的toArray()是否仅返回显式设置的属性?

Yii2 ActiveRecord toArray() 方法行为疑问

我在使用Yii2 ActiveRecord时,发现toArray()方法有个特殊行为:

$model = new UserModel; 
print_r($model->toArray());

尽管UserModel在数据库架构中已经定义了属性,但这段代码返回的是空数组[]。

我的使用场景是这样的:

$model = new UserModel; 
$model->name = 'name'; // 仅设置一个属性

// 在后续代码中
$existingModel = UserModel::findOne($id);
if ($existingModel) {
    // 覆盖显式设置的属性
    $existingModel->setAttributes($model->toArray());
    $existingModel->save();
}

我的疑问是:toArray()是否始终只返回显式设置过的属性(比如$model->name = '...'或者$model->setAttribute(...))?如果是这样,有没有官方文档可以确认这个行为?我在Yii2官方文档里没找到明确说明。


结论:是的,toArray() 默认仅返回显式设置过的属性

Yii2的ActiveRecord继承自yii\base\Model,toArray()的核心逻辑由Model类实现。

当实例化新的ActiveRecord对象时,所有属性处于未设置状态(即便数据库表有对应字段),此时调用toArray()只会返回主动赋值过的属性。原因是Model类内部通过getDirtyAttributes()筛选要序列化的属性——只有被修改过(显式设置)的属性才会被视为"dirty",进而被toArray()包含。

补充:如何让toArray()返回所有属性

如果需要返回所有已定义的属性(即使未设置),可以传入属性列表作为参数:

// 返回模型所有已定义的属性
$model->toArray($model->attributes());

也可以在自定义模型类中重写toArray()方法,自行指定返回的属性集合。

关于文档验证

官方文档没有直白说明这一点,但查看源码可验证:yii\base\Model::toArray()默认调用getDirtyAttributes()获取序列化属性,而getDirtyAttributes()仅返回被修改过的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:12:08