public function behaviors()
{
$inherit = parent::behaviors();
$inherit['memory'] = [
'class' => \yii\behaviors\AttributeBehavior::className(),
'attributes' => [
\yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => 'values',
\yii\db\ActiveRecord::EVENT_BEFORE_INSERT => 'values',
],
'value' => function ($event) {
$model = $event->sender;
if ($model->key == self::NAME_MEMORY_PERIOD_PROTOTYPE) {
...
}
return $model->values;
},
];
return $inherit;
}
之前一直有点蒙,今天测试一下,得出一些结果.
假设数据表有 id, key, values 三个字段
'attributes' => [
\yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => 'values',
],
'value' => function ($event) {
$model = $event->sender;
if ($model->key == self::NAME_MEMORY_PERIOD_PROTOTYPE) {
...
}
return $model->value;
},
EVENT_BEFORE_UPDATE
,EVENT_BEFORE_INSERT
事件发生在save之前.’value’必须有返回值,返回值会填入到对应字段中;$model->values
与$model->oldAttributes['values']
值不相同.EVENT_AFTER_UPDATE
,EVENT_AFTER_INSERT
事件发生在save之后.’value’可以没有返回值.$model->values
与$model->oldAttributes['values']
值相同.若点击编辑后未做任何修改便直接提交,不会触发
EVENT_BEFORE_UPDATE
和EVENT_AFTER_UPDATE
事件,甚至连updated_at都不会改变。不是只有修改’values’字段的内容才触发
EVENT_BEFORE_UPDATE
事件。修改’key’字段同样会触发EVENT_BEFORE_UPDATE
事件。‘attributes’是关联数组,所以不能有两个相同的键,否则后面会覆盖前面的值;