The*_*der 2 php activerecord yii2 yii2-model
我正在尝试通过setUsr_firstname对名为的属性使用setter方法对属性进行数据转换usr_firstname.
class User extends ActiveRecord implements IdentityInterface {
public function rules() {
return [
[['usr_firstname', 'usr_lastname', ... ], 'required'],
...
];
}
...
public function setUsr_firstname($value) {
$this->usr_firstname = fix_wrong_title_case($value);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我做以下事情:
$model = new User(['scenario' => User::SCENARIO_REGISTER]);
$model->usr_firstname = 'John';
Run Code Online (Sandbox Code Playgroud)
但是从不调用setter方法!我试过将方法命名为各种各样的东西 - 例如.setUsrFirstname - 但没有任何作用.我如何让它工作?
UPDATE
弄清楚它不适用于任何ActiveRecord属性,在属性名称中有或没有下划线.
如果直接声明属性或Active Record属性(无论是否使用下划线),都不会调用Setter方法.
Active Record的魔术__set方法直接将值分配给映射的属性.
您可以使用新的虚拟属性实现类似的功能:
public function setUsrFirstname($value)
{
$this->usr_firstname = doSomethingWith($value);
}
public function getUsrFirstname()
{
return $this->usr_firstname;
}
Run Code Online (Sandbox Code Playgroud)
所以现在你可以使用它:
$this->usrFirstname = 'John';
echo $this->usrFirstname;
Run Code Online (Sandbox Code Playgroud)
如果要在AR的生命周期中修改属性,您可以:
afterFind()在DB提取后更改它的方法,beforeSave()在保存到DB之前更改它的方法,validate()和clearErrors()).