在我的一些属性的Yii模型中,当真实属性为null或为空时,我想返回一些默认值。重写ActiveRecord在Yii中获取属性
例如说我有一个display_name
属性。没有设置时,我想返回first_name
。
到目前为止,我一直在使用的解决方法是创建一个名称不同的新方法,然后调用此方法。不过,如果我可以通过简单地以正常方式调用$model->display_name
来实现这一点,那就太好了。
在我的一些属性的Yii模型中,当真实属性为null或为空时,我想返回一些默认值。重写ActiveRecord在Yii中获取属性
例如说我有一个display_name
属性。没有设置时,我想返回first_name
。
到目前为止,我一直在使用的解决方法是创建一个名称不同的新方法,然后调用此方法。不过,如果我可以通过简单地以正常方式调用$model->display_name
来实现这一点,那就太好了。
我可能找到了我自己的答案。我优先于__get()
来检查这是否是我正在寻找的财产。我不确定这被认为是“最佳做法”。
public function __get($name) {
$current = parent::__get($name);
switch($name){
case 'display_name':
if(empty($current)){
return $this->first_name;
}
else{
return $current;
}
break;
default:
return $current;
}
}
类延伸CComponent
,包括CModel
,CActiveRecord
第一将寻找一个getter方法。
在你的榜样,你必须定义一个getter函数:
public function getdisplay_name() {
if (! empty($this->display_name)) {
return $this->display_name;
} else {
return $this->first_name;
}
}
请检查CActiveRecord :: __ get()implmenentation。当display_name是数据库属性时,您的示例不适用于CActiveRecord的实例。 – sieppl
这将在后面的大开关case语句的结果,我已经正如我所提到的描述更容易和更清洁的解决方案,我的回答 – Blacksonic
我的问题,我已经有了类似的解决方案。但我试图不必为所有人记忆备用功能,再加上一些模块或扩展可能不会被我编码。 –
我认为这将在版本2中改变。如果我们定义一个自定义的getX()方法,那么即使模型已经定义了x属性,也应该调用**我们的**覆盖方法。 –