Yii模型需显式配置TimestampBehavior:重写behaviors()返回含TimestampBehavior::class的数组,明确指定createdAtAttribute/updatedAtAttribute,DATETIME字段用new \yii\db\Expression('NOW()'),INT字段用time(),避免与数据库默认值冲突。

Yii 框架中,模型要自动处理 created_at 和 updated_at 这类时间字段,不能靠“继承时间戳行为”这种模糊说法——必须显式配置 TimestampBehavior,且关键细节不配对就会失效。它不是父类自带的功能,也不是写个 extends 就能触发。
必须手动在 behaviors() 中声明
ActiveRecord 默认完全不处理时间字段。哪怕数据库字段名是标准的 created_at/updated_at,也得在模型里写:
- 重写
behaviors()方法,返回包含TimestampBehavior::class的数组 -
value必须匹配数据库字段类型:DATETIME/TIMESTAMP 字段用new \yii\db\Expression('NOW()')或字符串格式;INT 类型才用默认time() - 明确指定
createdAtAttribute和updatedAtAttribute,否则行为不知道填哪个字段
字段类型决定 value 写法
填错 value 是最常见失败原因:
- DATETIME 类型(如 MySQL)→
'value' => date('Y-m-d H:i:s')或更推荐'value' => new \yii\db\Expression('NOW()')(由数据库生成,避开时区问题) - INT/BIGINT 类型 → 保留默认
'value' => time(),最稳妥 - 千万不能混用:给 DATETIME 字段配
time(),存进去就是一串数字,查出来显示异常
避免和数据库默认值冲突
如果表结构里已设 created_at DEFAULT CURRENT_TIMESTAMP,又在行为里配了 value,两者可能打架:
- 建议关掉 ActiveRecord 的
loadDefaultValues(在模型中设public $loadDefaultValues = false;) - 或者统一交给行为控制,删掉数据库字段的默认值定义,让逻辑集中
- 更新操作中,
EVENT_BEFORE_UPDATE只配updated_at,别把created_at也塞进去
关联模型不会自动继承
子模型不会因为父类配了行为就自动获得时间戳功能:
- 每个需要时间管理的模型,都得单独写一遍
behaviors() - 可以抽一个公共基类(比如
BaseModel extends ActiveRecord),在里面统一配好行为,再让各业务模型继承它 - 但注意:基类里的
behaviors()返回数组,子类若也重写该方法,需手动合并父类配置,否则会覆盖


















