如何运用ThinkPHP模型获取器和修改器,实现ThinkPHP字段自动读写处理技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1003个文字,预计阅读时间需要5分钟。
最常见的原因为字段名拼写错误。数据库字段是 `create_time`,模型中必须写成 `getCreateTimeAttr`,而不是 `getCreate_timeAttr`、`getCreatetimeAttr` 或其他形式。ThinkPHP 不会报错,而是静默跳过,导致代码修改无效。
另一个高发问题是类型转换冲突:protected $type = ['create_time' => 'datetime'] 和 getCreateTimeAttr 同时存在时,时间先被转成 Carbon 对象,再传给获取器;而 date('Y-m-d', $value) 传入对象会返回空字符串或警告。解决办法只有两个:
• 去掉 $type 声明,让原始时间戳直通获取器
• 或在获取器里判断类型:if ($value instanceof \Carbon\Carbon) { return $value->format('Y-m-d'); }
还要注意空值:数据库该字段为 NULL,$value 就是 null,直接 date() 会触发 warning。加一句 if (empty($value)) return ''; 更稳妥。
setPasswordAttr 存不进数据库的三个原因
修改器只在模型层写入流程中触发,绕过模型就完全失效。
本文共计1003个文字,预计阅读时间需要5分钟。
最常见的原因为字段名拼写错误。数据库字段是 `create_time`,模型中必须写成 `getCreateTimeAttr`,而不是 `getCreate_timeAttr`、`getCreatetimeAttr` 或其他形式。ThinkPHP 不会报错,而是静默跳过,导致代码修改无效。
另一个高发问题是类型转换冲突:protected $type = ['create_time' => 'datetime'] 和 getCreateTimeAttr 同时存在时,时间先被转成 Carbon 对象,再传给获取器;而 date('Y-m-d', $value) 传入对象会返回空字符串或警告。解决办法只有两个:
• 去掉 $type 声明,让原始时间戳直通获取器
• 或在获取器里判断类型:if ($value instanceof \Carbon\Carbon) { return $value->format('Y-m-d'); }
还要注意空值:数据库该字段为 NULL,$value 就是 null,直接 date() 会触发 warning。加一句 if (empty($value)) return ''; 更稳妥。
setPasswordAttr 存不进数据库的三个原因
修改器只在模型层写入流程中触发,绕过模型就完全失效。

