Yii2 在yii中创建和更新时设置默认值
我正在尝试使用以下规则更新yii 1.1中的一些字段,但它不起作用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
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规则不需要这样做。在这两种情况下,也不需要使用“何时”条件。见下面我的答案