ThinkPHP 6.0 启用自动时间戳需三步:设 protected $autoWriteTimestamp = true 开启、通过 $createTime 和 $updateTime 指定字段名(须与数据库列名一致)、确保数据表存在对应字段且类型匹配;不支持 TP5 下划线写法,仅 ORM 操作生效。

ThinkPHP 6.0 中设置模型自动时间戳,核心是三步:启用自动写入、指定字段名、确保数据库匹配。它不再支持 TP5 的 $autoWriteTimestamp 下划线写法,也不默认开启,必须显式配置。
启用自动时间戳功能
在模型类中添加以下属性:
-
必须设置:
protected $autoWriteTimestamp = true;—— 这只是开关,不指定字段名也不会生效 - 若需统一使用 DATETIME 格式(如
'2024-05-20 10:30:00'),可设为'datetime';若用 INT 存时间戳,设为'timestamp'或'integer'
定义时间戳字段名
字段名必须与数据库实际列名完全一致(含大小写、下划线):
- 默认是
create_time和update_time,但你可用任意名称,比如created_at、updated_at或_ctime - 在模型中明确声明:
protected $createTime = 'created_at';protected $updateTime = 'updated_at'; - 设为
false可单独关闭某一个,例如protected $updateTime = false;就只写创建时间
检查数据库和写入逻辑
光有模型配置还不够,以下环节缺一不可:
立即学习“PHP免费学习笔记(深入)”;
- 数据表中必须存在对应字段,类型推荐
DATETIME或TIMESTAMP;若用INT,还需加类型声明:protected $type = ['created_at' => 'integer']; - 仅对模型的
save()、create()(TP6 不再支持该方法)、data()->save()等 ORM 操作生效;Db::table()->insert()或原生 SQL 不触发 - 避免被
allowField()过滤:如果用了$model->allowField(true)->save($data),确保$data中未手动传入时间字段,否则会覆盖自动值
补充:读取时格式化显示
自动写入只管存,不管读出来怎么展示。若希望 API 返回 "2024-05-20" 而不是时间戳数字,需加访问器:
- 定义
getCreatedAtAttr()方法,对created_at字段做date('Y-m-d', $value)处理 - 若需同时返回原始时间戳和格式化字符串,可用
append添加虚拟字段,如created_at_text



















