thinkphp6中自动完成字段必须用$insert/$update数组或setxxxattr修改器实现,$_auto已彻底移除;v6.x版本下$_auto、$auto、$filter全部无效,v5.1+起须迁移至新机制,否则create_time为null、status无默认值、密码未加密等静默失败。

ThinkPHP6模型自动完成字段必须用$insert/$update数组或setXxxAttr修改器实现,$_auto已彻底移除,旧写法会导致create_time为NULL、status无默认值、密码未加密等静默失败问题。
确认ThinkPHP版本再动手
执行php think version命令查看输出结果:若显示v6.x,则$_auto、$auto、$filter全部无效;若为v5.0.x仍可有限使用但已废弃;v5.1+起所有自动完成逻辑必须迁移到$insert/$update数组或修改器。这一步跳过将导致后续所有配置白费力气,且不会报错,只会静默失败。
用$insert和$update数组控制字段写入时机
方法一:在模型类中定义保护属性
【protected $insert = ['create_time', 'status', 'password'];
【protected $update = ['update_time'];
字段名必须与数据库列名完全一致(如create_time不能写成createTime),且仅对save()、create()生效;Db::table()->insert()等直连查询完全绕过此机制。
用setXxxAttr修改器做字段级处理
方法二:对password字段自动MD5加密
在模型类中添加public function setPasswordAttr($value) { return md5($value); }
该方法仅在模型赋值时触发(如$user->password = '123'),不依赖表单提交方式,也不受白名单过滤影响。
用beforeWrite钩子统一注入业务逻辑
方法三:在模型init()中注册事件
第一步:调用self::event('before_write', function ($model) {
第二步:检查并填充空字段——if (empty($model->data['create_time'])) { $model->data['create_time'] = date('Y-m-d H:i:s'); }
第三步:更新时间逻辑——if (!empty($model->data['status'])) { $model->data['update_time'] = date('Y-m-d H:i:s'); })
⚠️关键点:必须操作$model->data数组,而非$model属性;且不能在钩子里修改主键或关联字段,否则save()可能出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











