tp6中\_auto已彻底失效,时间戳需用$autowritetimestamp+修改器组合实现;where()->update()不触发任何模型逻辑,必须改用实例save()或手动传值。

ThinkPHP 5.1+ 中 _auto 已完全失效,TP6 彻底删除;用它配时间戳或默认值,字段必然为空或不更新——不是你写错了,是框架根本不认。
为什么 _auto 在 TP5.1+ 里没反应
TP5.1 开始把 _auto、_validate、_filter 全部标记为废弃,运行时不报错、也不执行,就像注释掉了一样。你看到老教程里写的:
protected $_auto = [
['create_time', 'time', self::MODEL_INSERT, 'function'],
['status', 1],
];
这段代码在 TP5.1 或 TP6 下不会触发任何填充逻辑。常见现象包括:
-
create_time字段始终为null或0000-00-00 00:00:00 -
save()后查数据库,status还是空值 - 调试发现
create()返回的对象里字段已存在,但入库时被丢弃
根本原因:TP5.1 起 Model::create() 方法已移除对 _auto 的解析逻辑,save() 直接走数据写入流程,跳过所有旧式自动处理。
TP6 正确配置时间戳的两种方式
TP6 只支持两种可靠的时间戳写入机制:自动时间戳开关 + 修改器(mutator),二者适用场景不同:
- 如果只是补
create_time/update_time字段且类型固定(如datetime或int),直接开$autoWriteTimestamp - 如果要判断“仅当为空才填”“格式化为 Y-m-d”“兼容 null 和字符串输入”,必须用修改器
示例(推荐组合):
class User extends Model
{
protected $autoWriteTimestamp = true;
protected $createTime = 'create_time';
protected $updateTime = 'update_time';
public function setCreateTimeAttr($value)
{
return $value ?: date('Y-m-d H:i:s');
}
public function setUpdateTimeAttr($value)
{
return $value ?: date('Y-m-d H:i:s');
}
}
注意:$autoWriteTimestamp = true 会强制覆盖字段值,而修改器可做空值判断——两者不冲突,但逻辑优先级是「先走修改器,再由时间戳机制兜底」。
用 where()->update() 时时间戳和修改器全失效
这是最容易踩的坑:所有模型层逻辑(包括修改器、事件钩子、$autoWriteTimestamp)都只在 save()、create()、find()->save() 等实例方法中触发。
一旦写成:
User::where('id', 1)->update(['name' => 'foo']);
结果就是:
-
update_time不会自动更新 -
setUpdateTimeAttr()根本不调用 - 哪怕你绑了
onBeforeUpdate事件,也完全不触发
解决方案只有两个:
- 改用模型实例操作:
$user = User::find(1); $user->name = 'foo'; $user->save(); - 手动传时间:
User::where('id', 1)->update(['name' => 'foo', 'update_time' => date('Y-m-d H:i:s')]);
修改器命名和触发条件必须严格匹配
修改器函数名不是随便起的,必须满足:set + 字段名首字母大写 + Attr,且只在写入时生效:
- 字段叫
create_at→ 方法名必须是setCreateAtAttr(不是setCreate_AtAttr) - 字段叫
is_deleted→ 方法名是setIsDeletedAttr - 该方法只在
save()、create()、$model->data([...])->save()中触发 -
where()->update()、Db::table()->update()、原生 SQL 都不触发
另外,修改器接收的是「原始赋值」,可能是 null、字符串、时间戳整数——你要自己判断并返回最终入库值,框架不做二次转换。
最常被忽略的一点:TP6 的模型事件(如 onBeforeInsert)默认不注册,写了等于白写;而修改器只要命名对、字段在 save() 数据里,就一定会走。别在没验证基础机制是否生效前,就去调事件绑定顺序。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











