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

标签 activerecord yii2 yii2-model yii2-validation

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

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

我们需要在实例化类后立即设置默认值,以便 (new MyModel)->attr返回默认值 attr值(value)。

以下是一些可能性和他们遇到的问题:

  • 一)MyModel覆盖 init()方法并在 isNewRecord 时分配默认值是这样的:
    public function init() {
        if ($this->isNewRecord) {
            $this->attr = 'defaultValue';
        }
        parent::init();
    }
    

    问题 : 搜索。除非我们在 MySearchModel 中明确取消设置默认属性(非常容易出错,因为太容易忘记了),这也会在调用 search() 之前设置值在派生的MySearchModel类并干扰搜索(attr 属性已设置,因此搜索将返回不正确的结果)。在 Yii1.1 中,通过调用 unsetAttributes() 解决了这个问题。在调用 search() 之前, 但是 Yii2 中不存在这样的方法。
  • B) MyModel覆盖 beforeSave() 像这样的方法:
    public function beforeSave($insert) {
        if ($insert) {
            $this->attr = 'defaultValue';
        }
        return parent::beforeSave();
    }
    

    问题 : 未保存的记录中未设置属性。 (new MyModel)->attrnull .更糟糕的是,即使是其他依赖此值的验证规则也无法访问它,因为 beforeSave()验证后调用。
  • C) 为了确保值在验证期间可用,我们可以改写 beforeValidate() 方法并在那里设置默认值,如下所示:
    public function beforeValidate() {
        if ($this->isNewRecord) {
            $this->attr = 'defaultValue';
        }
        return parent::beforeValidate();
    }
    

    问题 :未保存(未验证)记录中仍未设置属性。我们至少需要调用$model->validate()如果我们想获得默认值。
  • D) 使用 DefaultValidator rules()在验证期间设置默认属性值,如下所示:
    public function rules() {
        return [
            [
                'attr', 'default',
                'value' => 'defaultValue',
                'on' => 'insert', // instantiate model with this scenario
            ],
            // ...
        ];
    }
    

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

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

    最佳答案

    有两种方法可以做到这一点。

    $model => new Model();
    

    现在$model具有数据库表中的所有默认属性。

    或者在您的规则中,您可以使用:
    [['field_name'], 'default', 'value'=> $defaultValue],
    

    现在$model将始终使用您指定的默认值创建。

    您可以在此处查看完整的核心验证器列表 http://www.yiiframework.com/doc-2.0/guide-tutorial-core-validators.html

    关于activerecord - Yii2:如何在 ActiveRecord 中设置默认属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39314213/

    相关文章:

    ruby-on-rails - 在 after_update 回调中获取更改的属性

    sql - Yii2 ActiveRecord : composite IN condition

    mysql - 查询之间的 Yii2 模型搜索

    php - 将逗号分隔列表从 Controller 传递到模型

    ruby-on-rails - ActiveRecord - 如果没有 child 离开,则销毁 parent

    ruby-on-rails - Rails ActiveRecord 迁移以使用 'NOT VALID' 参数添加外键

    yii2 - 为 Yii 2 设置数据库

    php - Yii2中如何实现join查询

    yii2 密码规则模式

    Yii2 从相关模型中只选择几列