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

Yii2 在yii中创建和更新时设置默认值,yii2,Yii2,我正在尝试使用以下规则更新yii 1.1中的一些字段,但它不起作用 public function rules() { return [ ['CreatedOn','default','value'=>time(),'isEmpty'=>true,'on'=>'insert'], ['CreatedBy','default','value'=>\Yii::$app->user->identity->id,'isEmpt

我正在尝试使用以下规则更新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'],
    ];
}
我希望在插入时更新
CreatedBy
CreatedOn
,在更新时更新
ModifiedBy
ModifiedOn

From,Yii2:

默认情况下,模型只支持名为
default

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

$model->scenario = 'insert';
您也可以在时使用
,而不是在
上使用
,即:

['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()
中设置它们的另一种方法是:

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',
            ],
        ];
    }
如果您只需要默认值的简单规则,这就足够了:

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

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

对于2016年4月发布的Yii2 2.0.8版,我在
'isEmpty'=>true
上出现了一个错误,因为根据它,需要一个函数,所以您必须这样做:
'isEmpty'=>函数($value){return true;}

当您使用这个解决方案时,即使在create上,您也会得到ModifiedBy的值,我相信这不是您的意图。在更新的情况下,写isEmpty返回true是可能的,但我只是使用了“when”,因为它对我来说更具可读性。因此,我对模型中规则的解决方案是:

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

这个问题的一个附带说明是,对于时间戳,您应该依赖数据库来填充它们,使用默认值CreatedOn和ModifiedOn的before update触发器。

欢迎使用堆栈溢出!我试着通过编辑语法和移动一些东西来让你的问题更容易理解。@nadeem你真的认为这是yii 1.1吗?这似乎是为了yii+@MuhammadRiyaz你当然是对的<代码>Yii::$app
构造仅在Yii2中使用。Yii1等价物是
Yii::app()
。OP应决定、编辑问题并正确标记。已编辑。感谢您指出感谢您的回复我尝试了第一种解决方案,但仍然无法工作,但我尝试了与您相同的第二种(beforeSave())解决方案,并已修复,但我仍在尝试第一种solution@topher
'isEmpty'=>true
覆盖检查字段是否为空。。他说一直都是这样。CreatedOn规则不需要这样做。在这两种情况下,也不需要使用“何时”条件。见下面我的答案