TP6自动时间戳需同时配置$autoWriteTimestamp、$createTime、$updateTime三者,缺一不可;全局auto_timestamp被废弃;save()新增判断更严格;字段类型须与写入格式匹配;分页数据不触发获取器。

TP6 中 $autoWriteTimestamp 默认关闭,且字段名映射机制变更,照搬 TP5.1 配置必然失效——不是代码写错了,是框架根本没启动时间戳逻辑。
TP5.1 和 TP6 的自动时间戳配置不兼容
TP5.1 模型里只写 protected $autoWriteTimestamp = true; 就能工作,因为框架默认识别 create_time/update_time 字段;但 TP6 完全反过来了:$autoWriteTimestamp = true 仅表示“启用开关”,必须同时声明 $createTime 和 $updateTime 才会真正写入。漏掉任意一个,字段就静默丢失。
- TP5.1 写法(在 TP6 中无效):
protected $autoWriteTimestamp = true;
- TP6 正确写法(三者缺一不可):
protected $autoWriteTimestamp = true;<br>protected $createTime = 'create_time';<br>protected $updateTime = 'update_time';
- 若数据库字段是
created_at,TP6 中必须显式写protected $createTime = 'created_at';,大小写、下划线必须和数据库列名【完全一致】
全局配置 auto_timestamp 在 TP6 中被忽略
TP5.1 支持在 config/database.php 中设 'auto_timestamp' => true 统一开启,但 TP6 已废弃该行为——模型层配置优先级远高于全局,即使你保留了这个配置项,它也不会生效。
- TP6 中删掉
database.php里的auto_timestamp项更安全,避免误导 - 想统一管理?用 trait 封装三行配置,再在各模型中
use TimeStampTrait; - 注意:TP6.3+ 开始,
$autoWriteTimestamp设为字符串(如'datetime')才能覆盖写入格式,设true仍走默认 int 格式
save() 行为变化导致 createTime 被跳过
TP5.1 的 save() 在新增时自动写 createTime,更新时自动写 updateTime;TP6 则更严格:只有明确判断为“新增”才会写 createTime,而判断依据是主键是否为空或 isUpdate() 状态。
立即学习“PHP免费学习笔记(深入)”;
- 调用
$model->isUpdate(true)->save()时,TP6 强制只更新updateTime,哪怕主键为空也会跳过createTime - 手动传了
'create_time' => time()进save($data),会直接覆盖自动写入逻辑 - 用了
allowField(true)却没把时间字段加入白名单,create_time会被过滤掉,且不报错
数据库字段类型与写入格式错配
TP6 不校验字段类型,只按配置拼 SQL。设了 $autoWriteTimestamp = 'datetime',但数据库字段是 INT(11),结果就是写入 0000-00-00 00:00:00 或直接失败;反过来,字段是 DATETIME 却用 true(默认写 int),MySQL 会尝试隐式转换,可能截断或报错。
-
'datetime'→ 字段类型必须是DATETIME或TIMESTAMP -
'timestamp'或true→ 字段类型建议INT或BIGINT - 字段是
INT但想存时间戳?必须加类型声明:protected $type = ['create_time' => 'integer'];
最常被忽略的点:TP6 分页查询(paginate())返回的是数组集合,不触发模型获取器,即使 getCreateTimeAttr 写得再完善,分页数据里看到的仍是原始时间戳或 NULL——这不是时间戳没写入,而是读取时没转换。



















