yii中created_at不自动赋值,主因是timestampbehavior未正确配置:需在behaviors()中指定createdatattribute、触发事件,并用new expression('now()')赋值;同时检查字段定义是否冲突、save()是否被绕过、数据库连接是否正常。

Yii 框架中 created_at 字段不自动赋值,通常不是数据库或模型定义的问题,而是行为(Behavior)没生效、配置不完整,或字段类型/默认值干扰了自动写入。核心解决方向是:确保 TimestampBehavior 正确挂载、触发时机匹配、时间值来源可靠。
确认 TimestampBehavior 已正确配置
必须在模型类中覆盖 behaviors() 方法,并返回包含 TimestampBehavior 的数组:
- 指定
createdAtAttribute和updatedAtAttribute与数据库字段名完全一致(如'created_at',注意下划线和大小写) - 明确声明触发事件:
EVENT_BEFORE_INSERT要覆盖created_at,EVENT_BEFORE_UPDATE覆盖updated_at - 推荐使用
new Expression('NOW()')(MySQL/MariaDB)或new Expression('CURRENT_TIMESTAMP')(兼容性更好),避免 PHPdate()函数带来的时区偏差
检查数据库字段定义是否冲突
如果字段本身设置了 DEFAULT CURRENT_TIMESTAMP 或 NOT NULL DEFAULT '0000-00-00 00:00:00',可能掩盖行为逻辑,甚至导致插入失败:
- 建议将
created_at定义为DATETIME NOT NULL,不设默认值(由 Yii 行为控制) - 若用 MySQL 5.6+,可设
DEFAULT CURRENT_TIMESTAMP作兜底,但 Yii 行为仍应为主力赋值源 - 避免字段允许 NULL 却未设默认值——ActiveRecord 插入时若该属性未显式赋值,会传
null,触发数据库报错
验证行为是否实际触发
常见静默失效原因:
- 模型未继承
\yii\db\ActiveRecord,或父类behaviors()被错误覆盖(未调用parent::behaviors()) - 手动调用
$model->save(false)跳过了验证和事件,导致行为不执行;应改用$model->save() - 批量插入(
insertAll())不触发 ActiveRecord 事件,需自行处理时间字段 - 数据库连接未启用或组件配置缺失,导致
Expression无法被正确解析为 SQL 片段
调试与验证方法
快速定位问题:
- 在行为的
value中临时加日志:function () { \Yii::debug('Timestamp triggered'); return new Expression('NOW()'); } - 开启 Yii 日志,查看 SQL 日志中 INSERT 语句是否含
created_at字段及对应值 - 用 Gii 重新生成模型,确认没有意外覆盖
behaviors()或清空了父类逻辑











