ThinkPHP 3.2字段缓存导致表结构变更后新字段失效,推荐关闭DB_FIELDS_CACHE:配置'DB_FIELDS_CACHE'=>false;调试模式下默认已关闭;应急可删Runtime/Data/_fields/下对应文件;高稳定场景可在模型中硬编码$ fields。

ThinkPHP 3.2 默认开启字段缓存,部署后若修改了数据库表结构(比如新增 status 字段),但模型仍按旧缓存写入,就会导致新字段无法插入或读取——根本原因就是 _fields 缓存没更新。最直接有效的解决方式,是通过 DB_FIELDS_CACHE 配置项关闭它。
在配置文件中设置 DB_FIELDS_CACHE = false
这是推荐的、一劳永逸的方法,尤其适合开发阶段频繁调整表结构的场景:
- 打开项目配置文件,通常是
Conf/config.php或入口目录下的config.php - 在配置数组中添加一行:
'DB_FIELDS_CACHE' => false, - 保存后无需清缓存,下次请求会自动绕过字段缓存,实时读取数据库表结构
确认调试模式是否已关闭字段缓存
如果你已开启调试模式(define('APP_DEBUG', true);),那其实不用额外配置——框架默认加载 debug.php,其中已设 'DB_FIELDS_CACHE' => false。所以:
- 开发时建议始终开启
APP_DEBUG,既能看到详细错误,又天然规避字段缓存问题 - 上线前切回
APP_DEBUG => false时,务必手动补上DB_FIELDS_CACHE => false,否则字段变更立即失效
临时清空字段缓存文件(应急用)
如果不想改配置,或只是临时修复某张表,可手动清理缓存文件:
立即学习“PHP免费学习笔记(深入)”;
- 进入运行时目录:
Runtime/Data/_fields/ - 删除对应数据表名的 PHP 文件(如
user.php、order.php) - 也可直接清空整个
_fields文件夹(不影响其他缓存) - 刷新页面,TP 会重新扫描表结构并生成新缓存
进阶:模型内硬编码字段(免IO、更可控)
对稳定性要求高的模型,可跳过自动探测,直接在模型类中定义字段:
class UserModel extends Model {
protected $fields = array(
'id',
'username',
'email',
'status', // 新增字段也在这里显式声明
'_pk' => 'id',
'_autoinc'=> true
);
}
这样既避免字段缓存干扰,也省去每次读库开销,适合字段稳定的核心模型。



















