在 yii 中,要使 updated_at 仅在更新时赋值而不参与新增,需在 timestampbehavior 的 attributes 配置中移除 activerecord::event_before_insert 对 updated_at 的映射,仅保留其在 event_before_update 中的设置。

在 Yii 框架中,updated_at 字段默认会在记录创建和更新时自动赋值(比如通过 TimestampBehavior)。但如果你希望**新增记录时不自动写入 updated_at**(即只在更新时更新该字段),需要关闭其在 INSERT 时的自动填充行为。
确认使用的是 TimestampBehavior
大多数情况下,updated_at 是通过 yii\behaviors\TimestampBehavior 实现的。检查模型中的 behaviors() 方法:
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::class,
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
// ⬇️ 关键:移除 INSERT 事件对 updated_at 的赋值
],
];
}
只在更新时设置 updated_at
将 updated_at 从 EVENT_BEFORE_INSERT 中移出,仅保留在 EVENT_BEFORE_UPDATE 中:
- ✅ 正确配置(新增不设、更新才设):
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'], // 仅 created_at
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
- ❌ 错误配置(新增和更新都设):
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'], // 不要这样
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
数据库字段默认值可选配合
为避免 updated_at 在新增时为 NULL 或意外填入 0/1970,建议在数据库层面设置默认值(如 MySQL):
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP- 或仅
DEFAULT CURRENT_TIMESTAMP(首次插入自动填,后续不更新) - Yii 中保持
updated_at不参与 INSERT,由数据库兜底初始值
手动控制(进阶场景)
如果某些特殊插入逻辑仍需显式指定 updated_at,可在保存前赋值:
$model = new YourModel(); $model->created_at = time(); // 不设 $model->updated_at,或明确设为 null / 0 / 同 created_at $model->save();
同时确保 rules() 中未强制验证 updated_at,且字段未设 required 规则。











