微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Yii2:如何在ActiveRecord中设置默认属性值?

这似乎是一个微不足道的问题,但是我能想到的所有明显的解决方案都有其自身的缺陷.

我们想要的是能够仅为新记录设置任何认的ActiveRecord属性值,使其在验证之前和验证期间可读,并且不会干扰用于搜索的派生类.

一旦我们实例化类,就需要设置和准备认值,以便(new MyModel) – > attr返回认的attr值.

以下是一些可能性和问题:

> A)在MyModel中覆盖init()方法并在isNewRecord为true时指定认值,如下所示:

public function init() {
    if ($this->isNewRecord) {
        $this->attr = 'defaultValue';
    }
    parent::init();
}

问题:搜索.除非我们在MySearchModel中显式取消设置我们的属性(因为它太容易忘记而非常容易出错),否则这也会在派生的MySearchModel类中调用search()之前设置值并干扰搜索(attr属性已经是设置所以搜索将返回不正确的结果).在Yii1.1中,这是通过在调用search()之前调用unsetAttributes()解决的,但是在Yii2中不存在这样的方法.
> B)在MyModel中覆盖beforeSave()方法,如下所示:

public function beforeSave($insert) {
    if ($insert) {
        $this->attr = 'defaultValue';
    }
    return parent::beforeSave();
}

问题:未在未保存的记录中设置属性. (new MyModel) – > attr为null.更糟糕的是,即使是依赖于此值的其他验证规则也无法访问它,因为在验证之后调用beforeSave().
> C)为了确保在验证期间值可用,我们可以覆盖beforeValidate()方法并在其中设置认值,如下所示:

public function beforeValidate() {
    if ($this->isNewRecord) {
        $this->attr = 'defaultValue';
    }
    return parent::beforeValidate();
}

问题:尚未在未保存(未经验证)的记录中设置属性.如果我们想获得认值,我们至少需要调用$model-> validate().
> D)在rules()中使用DefaultValidator在验证期间设置属性值,如下所示:

public function rules() {
    return [
        [
            'attr','default','value' => 'defaultValue','on' => 'insert',// instantiate model with this scenario
        ],// ...
    ];
}

问题:与B)和C)相同.在我们实际保存或验证记录之前,不会设置值.

那么设置属性值的正确方法是什么?没有概述的问题还有其他方法吗?

我知道它已得到解答,但我会添加我的方法.
我有Application和ApplicationSearch模型.在应用程序模型中,我添加init并检查当前实例.如果它的ApplicationSearch我跳过初始化.
public function init()
    { 
        if(!$this instanceof ApplicationSearch)  
        {
            $this->id = hash('sha256',123);
        }

        parent::init();
    }

同样如@mae在下面评论你可以检查当前实例中是否存在搜索方法,假设你没有添加任何带有名称搜索方法到非搜索基础模型,所以代码变为:

public function init()
    { 
        // no search method is available in Gii generated Non search class
        if(!method_exists($this,'search'))  
        {
            $this->id = hash('sha256',123);
        }

        parent::init();
    }

原文地址:https://www.jb51.cc/php/135212.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐