必须开启app_multi => true并配置在根目录config/app.php,每个应用需独立配置app/{name}/config/database.php,文件须返回含type等字段的数组,连接名须小写加下划线,模型$connection和db::connect()仅作用于当前应用。

多应用必须先开启 app_multi => true
不设这个开关,框架永远走单应用流程,后续所有「按应用隔离数据库」的配置都无效。它必须写在项目根目录的 config/app.php 里,不是某个子应用自己的 app/admin/config/app.php。漏设或设错位置,会导致所有应用共享同一套 database.php,根本谈不上独立。
每个应用必须有自己完整的 app/{name}/config/database.php
ThinkPHP 不会继承、合并或 fallback 到根目录的 config/database.php。常见错误是只改了主配置,以为子应用会自动同步——实际不会,直接报错:No database configuration found。
- 路径必须严格为
app/admin/config/database.php,不能是app/admin/database.php或config/database.php - 文件必须返回一个数组,至少包含
'type'、'hostname'、'database'、'username'、'password' - 哪怕内容和主配置一模一样,也得复制一份过去;没有“默认”机制
- 连接名(如
'admin_db')只在本应用的connections数组内生效,Db::connect('admin_db')绝不会跨到app/api去找
连接名和配置字段不能漏、不能错
连接名必须全小写、只含字母和下划线,比如 'log_db' 合法,'log.db' 或 'LogDB' 会静默 fallback 到 default 或直接抛 Connection not found: xxx。
-
'type'字段绝对不能漏,否则加载驱动失败,报Class 'PDO' not found - 每个连接块都要核对
'hostname'、'port'、'database'、'username'、'password',两个连接都指向同一台 MySQL 却配错库名,查的就是空库 -
.env无法定义多维结构,connections必须写死在database.php中,不支持database2.hostname这类写法
模型 $connection 和 Db::connect() 都只作用于当前应用
在 app/admin/model/User.php 里写 protected $connection = 'admin_db';,这只影响 admin 应用下的 User 模型;app/api/model/User.php 即使同名,也必须单独设自己的 $connection,否则默认走该应用自己的 default 连接。
-
$connection的值在模型类加载时读取一次,运行中 reload 配置不会刷新它 -
Db::connect('admin_db')返回的是新实例,必须立即链式使用或赋值给变量,写成Db::connect('admin_db'); Db::table('user')->select();第二行仍走 default -
with()关联查询时,关联模型仍用它自己定义的$connection,不会自动跨库 join
database.php,或错一个 $connection 值,整个链就断在应用边界上了。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











