thinkphp 5.1 中 update_time 写入为空或报错,主因是数据库字段类型与模型 $type 声明不匹配:datetime/timestamp 需配 autowritetimestamp 和 dateformat,int/bigint 需正确声明 type 并处理时间戳单位。

ThinkPHP 5.1 模型中 update_time 字段写入为空或报错,大概率不是代码漏了配置,而是数据库字段类型和模型声明没对齐——尤其当字段是 INT 却没告诉框架“这是时间戳”,或者用了 DATETIME 却传了整数,框架就会静默失败或写入 0000-00-00 00:00:00。
确认 update_time 字段真实存在且类型明确
先执行 SQL 查看表结构:
DESCRIBE your_table_name;
重点确认三点:
- 字段名是否为
update_time(或你自定义的如updated_at),大小写、下划线必须与模型配置完全一致 - 字段类型是否为
DATETIME、TIMESTAMP或INT - 是否允许
NULL,避免因默认值缺失导致插入失败
按字段类型匹配模型配置
模型里不能只写 $updateTime = 'update_time' 就完事,必须配套类型声明:
- 若数据库字段是
DATETIME或TIMESTAMP:protected $autoWriteTimestamp = true;<br> protected $updateTime = 'update_time';
(可选)加格式控制:protected $dateFormat = 'Y-m-d H:i:s'; - 若字段是
INT存秒级时间戳:protected $type = ['update_time' => 'integer'];<br> protected $updateTime = 'update_time';<br> protected $autoWriteTimestamp = true; - 若字段是
BIGINT存毫秒时间戳:protected $type = ['update_time' => 'bigint'];
并确保修改器返回毫秒值,例如:public function setUpdateTimeAttr($value) { return is_numeric($value) ? $value : round(microtime(true) * 1000); }
排除常见干扰项
即使类型配对正确,以下情况也会让 update_time 不生效:
- 用了
allowField()但没把update_time加入白名单,例如:$model->allowField(['id', 'name'])->save($data)→ 直接丢弃时间字段 - 调用
save()时传入了'update_time' => time(),会覆盖自动写入逻辑 - 执行的是
Db::update()或原生 SQL,模型层的自动时间戳完全不触发 - 更新操作未识别为“更新”:主键为空或
isUpdate(false)强制当成新增,此时只写create_time,跳过update_time
验证是否真正生效
最直接的办法是在保存前 dump 数据:
$user = new User(); $user->name = 'test'; dump($user->getData()); // 此时应无 update_time $user->save(); dump($user->getData()); // 保存后应出现 update_time 值
如果第二次 dump 里 update_time 仍为空,说明模型未触发写入;如果值是 0 或 1970-01-01,基本可断定是类型转换失败,回头检查 $type 配置和数据库字段类型是否一致。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











