84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
之前在yii1里
提交数据是$model->load()$model->save() 比如我要把 date类型转为int类型 会在 beforesave()里 $this->date = time() 转换
$model->load()
$model->save()
$this->date = time()
但是在yii2里
beforeSave(){ $this->date = time() }
会先走validate的 rule方法
就是说 没有进beforeSave转换之前就先执行了, 那beforeSave还有毛用了
光阴似箭催人老,日月如移越少年。
如果楼主是单纯想要给时间字段赋值,建议在模型里添加如下代码:
phppublic function behaviors() { return [ [ 'class' => TimestampBehavior::className(), 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['created_at','updated_at'], ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_at' ], ], }
php
public function behaviors() { return [ [ 'class' => TimestampBehavior::className(), 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['created_at','updated_at'], ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_at' ], ], }
然后我再正面回答一下楼主问题,流程如下:
flowst=>start: $model->save(runValidation) e=>end: 整个请求结束 runValidation=>condition: runValidation? beforeValidate=>operation: beforeValidate validate=>operation: validate(rules在这儿执行) afterValidate=>operation: afterValidate beforeSave=>operation: beforeSave save=>operation: save afterSave=>operation: afterSave st->runValidation runValidation(yes,right)->beforeValidate runValidation(no)->beforeSave beforeValidate->validate->afterValidate(left)->beforeSave beforeSave->save->afterSave->e
flow
st=>start: $model->save(runValidation) e=>end: 整个请求结束 runValidation=>condition: runValidation? beforeValidate=>operation: beforeValidate validate=>operation: validate(rules在这儿执行) afterValidate=>operation: afterValidate beforeSave=>operation: beforeSave save=>operation: save afterSave=>operation: afterSave st->runValidation runValidation(yes,right)->beforeValidate runValidation(no)->beforeSave beforeValidate->validate->afterValidate(left)->beforeSave beforeSave->save->afterSave->e
我勒个去,为了画这个流程图,我专门去看了下markdown的流程图语法。。。一晚上时间就白费了。。。楼主,你要负责
markdown
这样写试试:
public function beforeSave($insert) { if (parent::beforeSave($insert)) { $this->date = time(); return true; } else { return false; } }
不知道题主是什么困扰,但是你如果是非得不走rules(),可以直接在save()方法指定$runValidation为false
rules()
save()
$runValidation
false
RTFM
http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#save(...
如果楼主是单纯想要给时间字段赋值,建议在模型里添加如下代码:
这样写试试:
不知道题主是什么困扰,但是你如果是非得不走
rules()
,可以直接在save()
方法指定$runValidation
为false
RTFM
http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#save(...