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

时间:2015-03-10 13:01:42

标签: yii2

我正在尝试使用以下规则更新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

3 个答案:

答案 0 :(得分:12)

来自soju's excellent answer,Yii2:

  

默认情况下,模型仅支持名为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);
}

答案 1 :(得分:0)

这是正确的方法:

行为:

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',
            ],
        ];
    }

如果您只需要一个简单的默认值规则,这就足够了:

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

'isEmpty'=>true选项覆盖默认的isEmpty()函数并返回true(它总是被视为空),但它总是填充time()

答案 2 :(得分:0)

对于Yii2版本2.0.8从2016年4月开始我在'isEmpty'=>true时出错,因为根据documentation它需要一个函数,所以你必须这样做:'isEmpty' => function ($value) {return true;}

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

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

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