我尝试使用setter方法setUsr_firstname
对属性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);
}
}
然后我执行以下操作:
$model = new User(['scenario' => User::SCENARIO_REGISTER]);
$model->usr_firstname = 'John';
但是从不调用setter方法!我试过将方法命名为各种各样的东西 - 例如。 setUsrFirstname
- 但没有任何作用。我如何让它工作?
更新
弄清楚它不适用于任何ActiveRecord属性,在属性名称中有或没有下划线。
答案 0 :(得分:6)
如果直接声明属性或Active Record属性(无论是否使用下划线),都不会调用Setter方法。
Active Record的魔术func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
方法直接为映射属性赋值。
您可以使用新的虚拟属性实现类似的功能:
__set
所以现在你可以使用它:
public function setUsrFirstname($value)
{
$this->usr_firstname = doSomethingWith($value);
}
public function getUsrFirstname()
{
return $this->usr_firstname;
}
如果您想在AR的生命周期中修改属性,您可以:
$this->usrFirstname = 'John';
echo $this->usrFirstname;
方法,在数据库提取后更改它,afterFind()
方法,在保存到数据库之前对其进行更改,beforeSave()
和validate()
)。