【问题标题】:Override ActiveRecord get properties in Yii在 Yii 中覆盖 ActiveRecord 获取属性
【发布时间】:2012-11-15 09:40:25
【问题描述】:

在我的 Yii 模型中,当真实属性为 null 或空时,我想返回一些默认值。

例如说我有一个display_name 属性。未设置时,我想返回first_name

到目前为止,我一直在使用的解决方法是创建一个具有不同名称的新方法并改为调用这个方法。但是,如果我可以通过简单地调用$model->display_name 来实现这一点,那就太好了。

【问题讨论】:

    标签: activerecord yii overriding


    【解决方案1】:

    我可能已经找到了自己的答案。我正在覆盖__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;
                }
            }
    

    【讨论】:

    • 这将导致稍后出现大的 switch case 语句,我已经在我的回答中描述了一个更简单、更清洁的解决方案
    • 正如我在问题中提到的,我已经有了类似的解决方案。但我试图不必记住所有人的替代功能,另外一些模块或扩展可能不是我编写的。
    • 我认为这在版本 2 中会有所改变。如果我们定义一个自定义的 getX() 方法,那么即使模型已经定义了 x 属性,那么 我们的 覆盖方法应该被调用。
    【解决方案2】:

    扩展CComponent的类,包括CModelCActiveRecord首先会寻找getter方法。

    在您的示例中,您必须定义一个 getter 函数:

    public function getdisplay_name() {
        if (! empty($this->display_name)) {
            return $this->display_name;
        } else {
            return $this->first_name;
        }
    }
    

    【讨论】:

    • 请检查 CActiveRecord::__get() 实现。当 display_name 是数据库属性时,您的示例不适用于 CActiveRecord 实例。
    猜你喜欢
    • 2010-09-27
    • 2014-01-17
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多