我正在尝试使用以下规则更新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
。
答案 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的更新前触发器。