在 Yii2.0.24 中,只需将 TimestampBehavior 的 updatedAtAttribute 设为 null,即可仅保留 created_at 自动写入而完全关闭 updated_at 的自动更新;createdAtAttribute 仍指向 'created_at',value 使用 NOW() 表达式,beforeUpdate 时因 updatedAtAttribute 为 null 而跳过赋值。

在 Yii2.0.24 中,若只想保留 created_at 自动写入,而**完全关闭 updated_at 的自动更新逻辑**(即创建时填 created_at,后续任何 save() 或 update() 都不修改 updated_at),关键不是“禁用行为”,而是**精准控制 TimestampBehavior 的触发范围**。
明确模型时间字段的归属
Yii 默认使用 TimestampBehavior 同时管理两个字段。要只让 created_at 生效、updated_at 彻底失效,不能简单删掉配置——否则整个行为可能不触发,或报错字段不存在。正确做法是:
- 保持
TimestampBehavior启用,但将updatedAtAttribute设为 null 或一个不存在的字段名(如'updatedAtAttribute' => null) - 确保
createdAtAttribute指向真实存在的数据库字段(如'created_at') - 不设置
'value'为统一函数,避免误触updated_at
在模型中配置 behaviors() 方法
在你的 ActiveRecord 类里重写 behaviors(),例如:
public function behaviors()
{
return [
[
'class' => \yii\behaviors\TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => null, // 关键:设为 null,行为将忽略 updated_at
'value' => new \yii\db\Expression('NOW()'),
],
];
}
这样,beforeInsert 事件仍会为 created_at 赋值;而 beforeUpdate 事件发生时,因 updatedAtAttribute 为 null,行为不做任何操作,updated_at 字段保持原值不变。
补充说明:数据库字段可保留但不参与自动更新
不需要删除数据库中的 updated_at 字段。它依然存在,只是 Yii 不再主动写入。如果你希望该字段在创建时也留空(而非默认值),可在迁移中设为 ->nullable(),并确保表结构允许 NULL。
如果未来某次更新你又想手动设 updated_at,直接赋值即可:$model->updated_at = date('Y-m-d H:i:s');,这不会影响上述配置逻辑。


















