这似乎是一个微不足道的问题,但是我能想到的所有明显的解决方案都有自己的缺陷。
我们想要的是能够为新记录设置任何默认的 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 中不存在这样的方法。 MyModel
覆盖 beforeSave()
像这样的方法:public function beforeSave($insert) {
if ($insert) {
$this->attr = 'defaultValue';
}
return parent::beforeSave();
}
问题 : 未保存的记录中未设置属性。
(new MyModel)->attr
是 null
.更糟糕的是,即使是其他依赖此值的验证规则也无法访问它,因为 beforeSave()
验证后调用。 beforeValidate()
方法并在那里设置默认值,如下所示:public function beforeValidate() {
if ($this->isNewRecord) {
$this->attr = 'defaultValue';
}
return parent::beforeValidate();
}
问题 :未保存(未验证)记录中仍未设置属性。我们至少需要调用
$model->validate()
如果我们想获得默认值。 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/