核心是启用fields_cache并执行php think optimize:schema生成缓存,模型和Db类自动获取字段类型、长度等元信息,无需手写$schema;注意调试模式下缓存不生效,且需确保数据库用户有information_schema.COLUMNS查询权限。

想让 ThinkPHP 自动搞定数据库字段定义,不用手写 $schema,核心就一条:别手动填 schema,用 fields_cache + optimize:schema 组合拳。它不是“偷懒”,而是官方推荐的高效路径——缓存生成后,模型和 Db 类都能直接用,类型、长度、是否为空全都有,比硬编码更稳。
开启字段缓存并生成文件
在 config/database.php 中确认已启用:
-
'fields_cache' => true(注意拼写是 fields_cache,不是 fileds_cache) - 确保数据库用户有
SELECT权限访问information_schema.COLUMNS(否则注释读不到) - 执行命令生成缓存:
php think optimize:schema - 缓存文件会落在
runtime/schema/下,按数据库名.表名.php命名
schema 和 fields_cache 别混用
$schema 是模型里硬写的字段映射,只对当前模型生效;fields_cache 是运行时生成的通用缓存,对 Db::name() 和所有继承 think\Model 的模型都生效。二者目标一致,但逻辑不同——选一个就好,推荐用缓存。
- 如果写了
$schema又开了fields_cache,框架优先走缓存,$schema 被忽略 -
$schema必须写全表所有字段,漏一个就可能触发自动探测,导致类型错误或缓存失效 - 缓存生成后,改了数据库字段(比如加字段、改类型),必须重新执行
php think optimize:schema
中文注释能读出来吗?关键看权限和驱动
字段注释(column_comment)不会随基础字段信息自动带出,得靠 information_schema.COLUMNS 查。常见卡点:
立即学习“PHP免费学习笔记(深入)”;
- MySQL 8.0+ 默认限制对
information_schema的访问,确认用户有SELECT权限 - 用原生 SQL 验证:
SELECT column_name, column_comment FROM information_schema.COLUMNS WHERE table_schema = 'your_db' AND table_name = 'user'; - MariaDB 对
COMMENT字段别名支持不一致,建议统一用 MySQL 官方驱动 - 云数据库(如阿里云 RDS)可能屏蔽
column_comment,此时只能靠建表语句或文档补全
生成后怎么用?基本不用额外操作
缓存生效后,模型查询、Db 查询、验证器字段类型推导、甚至自动生成文档或 Swagger Schema 都能直接用到字段元信息。
- 模型无需再写
$schema,也不用担心字段类型错(比如 int 被当 string) - Db 类执行
Db::name('user')->field('id,name')->select()也能正确识别字段类型 - 配合自定义命令(如
gen:doc或schema),可基于缓存快速输出 Markdown 或 OpenAPI 文档 - 注意:缓存仅在部署模式(
app_debug = false)下生效,开发时设为 true 会跳过缓存



















