在Yii2.0.44中,禁用updated_at自动更新需移除或调整TimestampBehavior配置:设updatedAtAttribute为null,或完全移除该行为;若需条件更新,可覆盖beforeSave()手动控制;同时注意数据库层面ON UPDATE CURRENT_TIMESTAMP可能干扰。

在 Yii2.0.44 中,关闭模型自动更新 updated_at 时间戳,核心思路是**移除或调整 TimestampBehavior 的行为配置**,而不是删除字段或改数据库。因为自动更新由行为(Behavior)驱动,不是数据库默认值或框架强制逻辑。
只禁用 updated_at,保留 created_at
在模型类中重写 behaviors() 方法,显式指定仅对 created_at 生效,不将 updated_at 纳入更新触发字段:
- 删掉
updatedAtAttribute配置项,或将其设为null - 确保
attributes数组中,EVENT_BEFORE_UPDATE对应的字段不包含updated_at
示例代码:
public function behaviors()
{
return [
'timestamp' => [
'class' => \yii\behaviors\TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => null, // 关键:禁用自动更新 updated_at
'value' => new \yii\db\Expression('NOW()'),
],
];
}
完全关闭时间戳自动管理
若连 created_at 也不需要自动写入,直接移除整个 TimestampBehavior:
- 不注册该 behavior,模型的
beforeInsert和beforeUpdate就不会被干预 - 插入或更新时需手动赋值:
$model->created_at = date('Y-m-d H:i:s');或留空(依赖数据库 DEFAULT)
用 beforeSave 手动控制更灵活
如果需要条件性更新(比如仅当某些字段变化才刷新 updated_at),推荐覆盖 beforeSave():
- 检查是否为更新操作:
$this->isNewRecord === false - 按需设置:
$this->updated_at = date('Y-m-d H:i:s');(或使用time()存整型) - 避免行为层干扰,逻辑清晰且可控
注意字段类型与数据库行为的冲突
即使关闭了 Yii 行为,MySQL 的 TIMESTAMP 字段若设置了 ON UPDATE CURRENT_TIMESTAMP,仍会在 SQL 层自动更新——这和 Yii 无关:
- 检查建表语句或迁移文件,确认没有
ON UPDATE CURRENT_TIMESTAMP - 必要时用原生 SQL 修改字段:
ALTER TABLE xxx MODIFY COLUMN updated_at DATETIME; -
DATETIME类型无自动更新能力,更适合作为纯应用层管理字段


















