在 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'],
];
}
我希望在插入时更新 CreatedBy
和 CreatedOn
,在更新时更新 ModifiedBy
和 ModifiedOn
。
来自 ,使用 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 的更新前触发器。
我正在尝试使用以下规则更新 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
。
来自
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 的更新前触发器。