ThinkPHP 自动写入 create_time 和 update_time 需配置 database.php 的 'auto_timestamp' 并匹配字段类型:设为 true(INT 字段)或 'datetime'(DATETIME/TIMESTAMP 字段),字段名必须严格为 create_time/update_time,且仅在模型操作中生效。

想省事地让 ThinkPHP 自动写入 create_time 和 update_time,直接改数据库配置文件是最简单的方式——但必须配对、匹配、不遗漏,否则“省事”就变成“查半天”。
一、database.php 里只改这一项
打开 config/database.php,找到 'auto_timestamp' 这一行:
- 设为
true:自动写入整型时间戳(int类型字段) - 设为
'datetime':自动写入Y-m-d H:i:s格式字符串(对应DATETIME或TIMESTAMP字段) - 设为
false或删掉该配置:全局关闭,模型级配置才起作用
⚠️ 注意:'auto_timestamp' => 'datetime' 必须搭配数据库字段类型为 DATETIME 或 TIMESTAMP;若字段是 INT 却配成 'datetime',会写入失败或存成空值。
二、字段名和类型必须提前对齐
全局配置不认自定义字段名,默认只处理 create_time 和 update_time。所以:
立即学习“PHP免费学习笔记(深入)”;
- 数据库表里必须真实存在这两个字段,名字大小写、下划线一个都不能错
- 字段类型要和
auto_timestamp值一致:
•true→ 字段类型为INT
•'datetime'→ 字段类型为DATETIME或TIMESTAMP - 字段允许为
NULL,或设默认值(如CURRENT_TIMESTAMP),避免严格模式下插入报错
三、用对方法,不然白配
自动写入只在模型操作中生效,跟 Db 类无关:
- ✅ 正确:
$user = new User(); $user->name = 'xxx'; $user->save(); - ❌ 无效:
Db::name('user')->insert(['name' => 'xxx']);—— 完全绕过模型,时间字段不会自动填
如果用了 allowField(),记得时间字段得在白名单里,否则会被过滤掉。
四、不想全局开?那就关掉它
如果部分表没有时间字段,或某些模型需要手动控制,建议:
- 把
database.php中的'auto_timestamp'设为false或注释掉 - 只在具体模型里启用:
protected $autoWriteTimestamp = true;,再配字段名 - 这样更安全,避免新增表漏建时间字段导致插入失败



















