tp6.0模型修改器不执行的主因是字段名与修改器方法名不匹配、赋值未触发持久化、或使用data()等绕过逻辑;须严格遵循下划线字段→驼峰setxxxattr命名,且仅在save/create/update时生效。

TP6.0 模型修改器不执行,常见于字段命名与方法名不匹配、赋值方式绕过模型逻辑、或未触发持久化动作——直接给对象属性赋值后不调用 save(),修改器永远不会运行。
确认字段命名与修改器方法名严格一致
字段是下划线命名(如 user_name),对应修改器方法名必须是驼峰式首字母大写(setUserNameAttr),不能写成 setusernameattr 或 set_user_name_attr。【TP6 不做任何自动转换,大小写和驼峰规则必须手工对齐】
打开模型类,检查方法名是否符合:set + 字段名驼峰 + Attr。例如字段 password → setPasswordAttr,字段 last_login_time → setLastLoginTimeAttr。
如果方法名写成全小写(如 setpasswordattr),框架完全无法识别,也不会报错,静默跳过。
确保修改器只在 save / create / update 时触发
修改器不是“赋值即生效”,而是仅在模型执行写入操作时才执行。以下写法 ✅ 触发:
$user = new User(); $user->password = '123'; $user->save();
User::create(['password' => '123']);
$user = User::find(1); $user->password = 'new'; $user->save();
以下写法 ❌ 不触发:
$user->password = '123'; // 仅赋值,无 save()
$user->data(['password' => '123'])->save(); // data() 方法绕过所有修改器逻辑
【data() 是高危操作,它直接填充原始数据数组,跳过验证、修改器、自动时间戳等全部模型层逻辑】
检查字段是否被排除在写入范围之外
第一步:确认该字段没被 protected $readonly 或 protected $disuse 包含;
第二步:检查 save() 调用时是否传了 allowField 参数,例如 $user->allowField(['id', 'name'])->save() —— 若 password 不在此白名单中,它会被彻底忽略,修改器自然不执行;
第三步:查看数据库表结构,确认字段真实存在且类型可写(比如字段设为 GENERATED ALWAYS AS,则 TP6 无法写入,save() 会静默跳过该字段)。











