Yii2保存时禁用TimestampBehavior失效问题及解决
问题:Yii2中调用
detachBehaviors()无法阻止updated_at字段自动更新? 我在编写Yii2的ConsoleController命令,想要修改数据库中课程的标题,同时不想让updated_at字段自动更新。于是尝试用Yii2文档里的detachBehaviors()方法禁用TimestampBehavior,但执行后updated_at还是会被自动修改。
原代码如下:
//console/controllers/ConsoleController.php public function actionChangeCourseTitle() { $model = Course::find->where(['id' => $id])->all(); $model->title = "new title"; $model->detachBehaviors(); // 试图禁用TimestampBehavior $model->save(); }
排查与解决
后来发现问题根本不在Yii2的行为上,而是数据库表的SQL定义导致的。原来的updated_at字段设置了数据库层面的自动更新规则:
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
这个ON UPDATE CURRENT_TIMESTAMP是MySQL的特性,只要该行数据被修改,数据库就会自动把updated_at更新为当前时间,完全不受Yii2代码控制,所以调用detachBehaviors()自然无效。
执行以下SQL修改表结构,去掉ON UPDATE CURRENT_TIMESTAMP规则后,问题解决:
ALTER TABLE `course` MODIFY COLUMN `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
内容的提问来源于stack exchange,提问作者paul mart
相关产品推荐
相关产品推荐

