You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:50:24