我想在Yii中执行以下操作:
When the attribute `a` in my model class `M` is set, do something.
尝试使用像setA($value)
这样的setter但是没有调用它,因为Yii CActiveRecord
首先检测属性是否存在于数据库中(并指定它),如果它存在,则数据库中不存在(即它不是表属性),然后查找正常的实例变量。最后的后备是调用属性访问者。
(编辑 - 我的解决方案顺序错了:查找似乎首先是实例变量,然后是属性,最后是访问者 - 无论如何,我的问题仍然是一样的因为如果不存在具有该名称的数据库字段,则解析访问者)
Here它显示了__set的内部机制(有点上层,__ get)。
问题:如何反转订单,至少对某个属性?这意味着:我实际上想要使用像setA($value)
这样的setter来捕获数据库字段版本,执行字段分配(即实际的$ this-> a,但是它应该在没有陷入堆栈溢出错误的情况下完成)在setA
方法
答案 0 :(得分:2)
合理的方法是覆盖模型类中的CActiveRecord::setAttribute
,使其按照您需要的方式运行:
class M extends CActiveRecord {
....
public function setAttribute($name,$value) {
if($name === 'a') {
.. do something
}
return parent::setAttribute($name, $value);
}
....
}