每个应用必须有独立database.php文件,不能继承根目录配置;路径须为app/{name}/config/database.php,缺失则报“No database configuration found”;Db::connect()和模型$connection均只作用于当前应用配置。

ThinkPHP 多应用模式下,每个应用必须有自己独立的 database.php 文件,不能靠继承或共享根目录配置——这是最常踩坑的起点。
app/admin/config/database.php 必须真实存在且路径严格匹配
多应用数据库隔离的前提是:每个子应用(如 admin、api)在自己的配置目录下,必须有一份完整的 database.php。它不会自动从根目录 config/database.php 合并或覆盖,也不会读取 .env 里同名键的值(除非你手动加载)。
- 路径必须是
app/admin/config/database.php,不是app/admin/database.php,也不是config/database.php - 文件必须返回一个数组,且至少包含
'type'、'hostname'、'database'、'username'、'password' - 如果该文件缺失,框架直接抛出错误:
No database configuration found - 哪怕内容和主配置一模一样,也得复制一份过去——没有“默认 fallback”机制
Db::connect('mysql_read') 只查当前应用的 connections
你在 app/admin 里调用 Db::connect('mysql_read'),框架只去 app/admin/config/database.php 的 connections 数组里找 mysql_read 这个键;绝不会跨到 app/api 或根目录下搜。
- 连接名必须全小写、不含点号(如
db.log)、不含大写字母(如LogDB),否则报Connection not found: xxx -
connections数组里的每个连接都必须显式声明'type'字段,漏了会触发Class 'PDO' not found - 临时传数组方式(
Db::connect([...]))不走连接池,高并发下容易触发Too many connections,仅限调试或极低频场景
模型 $connection 绑定只在本应用内生效
在 app/admin/model/User.php 里写 protected $connection = 'mysql_read';,这只影响 admin 应用下的 User 模型;app/api/model/User.php 即使类名相同,也必须单独设自己的 $connection,否则默认走该应用自己的 default 连接。
立即学习“PHP免费学习笔记(深入)”;
- 这个值在模型类加载时读取一次,运行中 reload 配置不会刷新它
-
with()关联查询时,关联模型仍用它自己定义的$connection,不会自动跨库 join - 想让
admin应用读api应用的表?不行。两个应用容器完全隔离,不能通过app('api')->make(UserModel::class)获取对方模型
真正容易被忽略的是:多应用 + 多库不是「配完就自动隔离」,而是每个应用的数据库配置、模型绑定、查询入口都必须在各自作用域内闭环完成——少一个 database.php,或错一个入口绑定,整个链路就断在第一步。



















