gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:09:38 28 4
gpt4 key购买 nike

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

我们想要的是能够为新记录设置任何默认的 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com