ThinkPHP中saveAll默认触发自动时间戳,可通过disableTimestamp()、timestamps=>false参数或手动传入时间字段等方式关闭或控制。

在 ThinkPHP 中,saveAll 方法默认会触发模型的自动时间戳(如 create_time、update_time),即使你传入了数据,只要模型开启了时间戳功能(protected $autoWriteTimestamp = true),就会自动写入或更新时间字段。
关闭 saveAll 的自动时间戳(全局禁用)
如果你不希望任何数据在 saveAll 时被自动写入时间戳,最直接的方式是**在模型中临时关闭时间戳**:
- 在调用
saveAll前,设置模型的$autoWriteTimestamp = false - 或者使用
disableTimestamp()方法(ThinkPHP 6.0.12+ 支持)
示例(TP6):
$userModel = new UserModel();
$userModel->disableTimestamp(); // 关闭自动时间戳
$userModel->saveAll([
['name' => '张三', 'email' => 'z3@example.com'],
['name' => '李四', 'email' => 'l4@example.com']
]);
仅对当前 saveAll 操作跳过时间戳(推荐)
更稳妥的做法是:保持模型配置不变,只在本次保存中忽略时间戳字段。可通过以下方式实现:
立即学习“PHP免费学习笔记(深入)”;
- 显式传入
['timestamps' => false]作为第二个参数(TP6.0.8+ 支持) - 该参数会跳过所有时间戳字段的自动写入逻辑
示例:
UserModel::saveAll([
['name' => '王五', 'email' => 'w5@example.com'],
['name' => '赵六', 'email' => 'z6@example.com']
], ['timestamps' => false]);
手动控制时间字段(灵活但需注意)
若你仍想保留部分时间控制(比如只写 create_time,不更新 update_time),可:
- 将时间字段作为普通字段显式传入(如
'create_time' => date('Y-m-d H:i:s')) - 同时设置
protected $updateTime = false或protected $updateTime = null来禁用更新时间 - 注意:此时
saveAll不会覆盖你手动传入的时间值
检查模型基础配置是否影响行为
确认模型中没有强制开启时间戳的冗余配置:
- 避免同时设置
$autoWriteTimestamp = true和$createTime/$updateTime为字符串却未定义字段 - 若数据库无对应时间字段,又开启自动写入,可能报错或静默失败
- 建议统一用
protected $autoWriteTimestamp = 'datetime'或false明确声明



















