多应用模式必须在根目录config/app.php中设置app_multi => true,否则所有应用共享同一数据库配置;每个应用需独立配置database.php,db::connect()仅查找当前应用connections,模型$connection绑定仅对本应用生效。

多应用模式必须先开启 app_multi
不设 app_multi => true,框架永远走单应用流程,后续所有「按应用隔离数据库」的配置都无效。这个开关必须放在项目根目录的 config/app.php 中,而不是某个应用自己的 app/{name}/config/app.php。设错位置或漏设,会导致所有应用共享同一套 database.php,根本谈不上独立。
每个应用的 database.php 必须单独放、不能继承主配置
ThinkPHP 6+ 的多应用下,app/admin/config/database.php 和 app/api/config/database.php 是完全独立的文件,它们不会合并、覆盖或继承根目录下的 config/database.php。常见错误是只改了主配置,以为子应用会自动同步——实际不会。
- 每个应用目录下都要有自己完整的
database.php,哪怕内容一样也得复制一份 - 连接键名(如
mysql、pgsql)可以重名,因为作用域仅限本应用 - 如果某个应用没配
database.php,它会直接报错:「No database configuration found」
Db::connect() 只认当前应用内的 connections 键名
在 app/admin 里调用 Db::connect('log_db'),框架只去 app/admin/config/database.php 的 connections 数组里找 log_db,绝不会跨到 app/api 或根目录去查。这点和单应用完全不同——你不能靠一个全局连接名打通所有应用。
- 确保
connections数组里定义了type字段,否则会报Class 'PDO' not found - 连接名禁止含点号(如
db.log)或大写字母(如LogDB),否则Connection not found: xxx - 别在控制器里反复调用
Db::connect(['hostname' => ...]),临时数组方式不走连接池,高并发下 MySQL 很快就Too many connections
模型 $connection 绑定只对本应用内生效
protected $connection = 'mysql_read'; 这行代码写在 app/admin/model/User.php 里,只影响 admin 应用下的 User 模型;app/api/model/User.php 即使同名,也要单独设自己的 $connection,否则默认走该应用自己的 default 连接。
- 这个值在模型类加载时读取一次,运行中 reload 配置不会刷新它
-
with()关联查询时,关联模型仍用它自己定义的$connection,不会自动“跨应用”或“跨库 join” - 跨应用数据同步只能靠手动查两次再 PHP 合并,框架不提供自动路由能力
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











