先确认配置系统是否正常工作:执行config('database.hostname')和config('app.app_debug'),若返回null则配置未加载;检查runtime/config/下是否有缓存文件,空或缺失说明加载中断;再用Db::connect()->query('SELECT VERSION()')验证数据库连接是否生效。

ThinkPHP模型查询为空,但不确定是不是配置没加载到位,得先确认配置系统本身是否已正常工作——因为很多“查不到数据”的表象,其实是底层连接、数据库名、表前缀等关键配置压根没生效。
看 config() 能否读出基础配置
在控制器或调试入口里直接执行:
config('database.hostname') —— 如果返回 null 或空字符串,说明 database 配置分组根本没加载;
config('app.app_debug') —— 这个是框架自带配置,如果也读不到,大概率是整个配置系统初始化失败。
注意:config() 默认只读取已加载的分组。你改了 config/database.php,但没重启服务或清缓存,它可能还在用旧值。
检查 runtime/config/ 下有没有生成缓存文件
ThinkPHP 启动时会把所有已加载的配置合并写入 runtime/config/app.php(或其他分组名)。打开这个文件:
立即学习“PHP免费学习笔记(深入)”;
- 如果文件为空或不存在 → 配置加载流程中断了;
- 如果里面有 database、app、cache 等完整数组 → 说明配置已载入,问题不在加载环节;
- 如果 database 数组里 hostname 是 localhost,但你实际用的是 Docker 容器名 pg → 那是配置内容错了,不是没加载。
验证数据库连接是否真被配置驱动使用
别只信模型代码,要绕过模型直连验证:
Db::connect('mysql')->query('SELECT VERSION()') —— 成功返回版本号,说明数据库配置已生效且能通;
Db::name('user')->where('id', 1)->find() —— 如果返回 null,但上面 query 成功,说明是 SQL 或数据问题,不是配置没加载。
特别注意:PostgreSQL 配置里写了 charset 就会静默失效,MySQL 配置里 host 写成 localhost 在 Docker 里也可能连不上——这些都属于“配置已加载但内容不合法”,需单独排查。
确认自定义配置是否显式 load 过
如果你加了 app/config/api.php 这类自定义配置,必须手动调用:
Config::load(app_path() . 'config/api.php', 'api');
否则 config('api.timeout') 一定为 null。这不是 Bug,是 ThinkPHP 的设计机制:非标准路径配置不会自动扫描,必须显式载入并指定分组名。
常见漏点:load 写在控制器里,每次请求都执行一次;正确位置应在 Bootstrap::boot() 或中间件中提前加载。



















