在 yii 中设置创建和更新的默认值

Setting default values on create and update in yii

我正在尝试使用以下规则更新 yii 1.1 中的某些字段,但它不起作用。

public function rules()
{
    return [
       ['CreatedOn','default','value'=>time(),'isEmpty'=>true,'on'=>'insert'],
       ['CreatedBy','default','value'=>\Yii::$app->user->identity->id,'isEmpty'=>true,'on'=>'insert'],
       ['ModifiedOn','default','value'=>time(),'isEmpty'=>true,'on'=>'update'],
       ['ModifiedBy','default','value'=>\Yii::$app->user->identity->id,'isEmpty'=>true,'on'=>'update'],
    ];
}

我希望在插入时更新 CreatedByCreatedOn,在更新时更新 ModifiedByModifiedOn

来自 ,使用 Yii2:

By default, a model supports only a single scenario named default

因此,您应该在控制器中手动设置场景,即:

$model->scenario = 'insert';

您也可以使用 when 而不是 on 即:

['CreatedOn', 'default', 'value'=>time(), 'isEmpty'=>true, 'when'=>
    function($model) { return $model->isNewRecord; }
],
['ModifiedOn', 'default', 'value'=>time(), 'isEmpty'=>true, 'when'=>
    function($model) { return !$model->isNewRecord; }
],

rules() 中设置它们的替代方法是使用 beforeSave() 来设置它们:

public function beforeSave($insert) {
    if ($insert) {
        $this->CreatedBy = \Yii::$app->user->identity->id;
        $this->CreatedOn = time();
    } else {
        $this->ModifiedBy = \Yii::$app->user->identity->id;
        $this->ModifiedOn = time();
    }
    return parent::beforeSave($insert);
}

正确的做法是:

行为:

public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => 'created_on',
                    ActiveRecord::EVENT_BEFORE_UPDATE => 'modified_on',
                    ActiveRecord::EVENT_BEFORE_DELETE => 'deleted_at',
                ],
                'value' => function () {
                    return date('Y-m-d H:i:s');
                }
            ],
            [
                'class' => BlameableBehavior::className(),
                'createdByAttribute' => 'created_by_id',
                'updatedByAttribute' => 'updated_by_id',
            ],
        ];
    }

如果您只需要 default 值的简单规则,这就足够了:

 public function rules()
    {
        return [
            ['CreatedOn','default','value'=>time()],
            ['ModifiedOn','default','value'=>time(),'isEmpty'=>true],
        ...
        ]
    }

'isEmpty'=>true 选项覆盖默认的 isEmpty() 函数和 returns true(它总是被视为空)因为它总是填充 time()

对于 2016 年 4 月的 Yii2 版本 2.0.8,我在使用 'isEmpty'=>true 时遇到错误,因为根据 documentation 它需要一个函数,因此您必须这样做:'isEmpty' => function ($value) {return true;}

当您使用此解决方案时,即使在创建时也会获得 ModifiedBy 的值,我相信这不是本意。在更新的情况下,可以将 isEmpty 写入 return true 但我只是使用 'when' 因为它对我来说更具可读性。因此,我对模型中规则的解决方案是:

    ['CreatedBy', 'default', 'value' => Yii::$app->user->id],
    ['ModifiedBy', 'default', 'value' => Yii::$app->user->id,
         'when' => function ($model) { return !$model->isNewRecord;}],

这个问题的旁注是,对于时间戳,您应该依靠数据库来填充它们,CreatedOn 具有默认值,而 ModifiedOn 的更新前触发器。