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
相关产品推荐
相关产品推荐

