数据库中没有相应字段的Yii2模型属性

数据库中没有相应字段的Yii2模型属性,yii2,Yii2,长话短说,我正在构建一些简单的审计功能,将数据库记录以前的值存储在审计表中。我使用“getOldAttributes”查找正在审核的记录的所有数据库列的旧值。对于一个模型,我有另一个名为permissions的属性(不作为数据库列存在),我希望将其与其他oldAttributes一起存储。将“public$permissions;”添加到我的ActiveRecord类的顶部是为了将数据从表单传递到模型中进行处理,但该属性不包括在GetOldAttributes调用中。我读过关于使用getter/

长话短说,我正在构建一些简单的审计功能,将数据库记录以前的值存储在审计表中。我使用“getOldAttributes”查找正在审核的记录的所有数据库列的旧值。对于一个模型,我有另一个名为permissions的属性(不作为数据库列存在),我希望将其与其他oldAttributes一起存储。将“public$permissions;”添加到我的ActiveRecord类的顶部是为了将数据从表单传递到模型中进行处理,但该属性不包括在GetOldAttributes调用中。我读过关于使用getter/setter使该属性像常规AR属性一样工作的各种想法,但没有任何东西是有效的,甚至没有任何意义


TLDR;AR类具有公共属性,我希望能够像所有其他数据库属性一样访问该属性(但不实际保存在数据库中)。

尝试重写ActiveRecord的getAttributes()方法:

public function getAttributes($names = null, $except = [])
{
    return array_merge(['permissions'], parent::getAttributes($names, $except));
}

而不是getAttributes(),我重写了attributes(),所以现在我的类打开时包含以下内容:public$permissions;公共函数attributes(){return array_merge(['permissions'],parent::attributes());}然后,我强制使用“$this->setOldAttribute('permissions','oldValue');”设置旧值,这一切都可以工作(非常感谢),但似乎应该有一种更简单的方法,特别是因为属性()doc似乎表明,简单地将$permissions声明为public就足以让它“正常工作”。正如一个说明,我必须使用['permissions'=null],而不仅仅是['permissions'],这似乎创建了一个权限值,而不是一个键。