thinkphp 6 不支持 .env 中数组语法配多库,必须用「前缀_下划线」扁平键名(如 db_mysql_primary_host),连接名取前缀小写形式(mysql_primary);需在 config/database.php 的 connections 中引用这些环境变量,并显式调用 db::connect('mysql_primary') 或设模型 protected $connection = 'mysql_primary'。

ThinkPHP 6 的 .env 文件里怎么配多个数据库连接
ThinkPHP 6 不支持在 .env 中直接用数组语法(比如 DB_CONNECTIONS=[...])定义多连接,它只认扁平化的键值对。必须用「前缀 + 下划线」方式声明每个连接的独立配置项。
例如你要配两个 MySQL 连接:mysql_primary 和 mysql_backup,就得在 .env 里这样写:
DB_TYPE=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=app_main DB_USER=root DB_PWD=123456 DB_MYSQL_PRIMARY_HOST=192.168.1.10 DB_MYSQL_PRIMARY_PORT=3306 DB_MYSQL_PRIMARY_NAME=app_primary DB_MYSQL_PRIMARY_USER=primary_user DB_MYSQL_PRIMARY_PWD=pass1 DB_MYSQL_BACKUP_HOST=192.168.1.11 DB_MYSQL_BACKUP_PORT=3306 DB_MYSQL_BACKUP_NAME=app_backup DB_MYSQL_BACKUP_USER=backup_user DB_MYSQL_BACKUP_PWD=pass2
注意:所有带下划线的键名,前缀部分(如 MYSQL_PRIMARY)会成为连接名;中间不能有短横或点号,只能是大写字母、数字、下划线。
如何在代码里调用这些多连接
配置写完后,得在模型或 Db 类中显式指定连接名,TP6 才会加载对应配置。连接名就是你 .env 键名中下划线前的部分,比如 DB_MYSQL_PRIMARY_HOST 对应连接名 mysql_primary。
常见用法:
- 用
Db::connect('mysql_primary')获取连接对象,再链式操作 - 在模型类里设置
protected $connection = 'mysql_primary'; - 临时切换:
(new User())->connection('mysql_backup')->select();
别指望 Db::table('user')->connect('mysql_primary') —— connect() 不是查询构造器方法,不能链在 table() 后面。
为什么改了 .env 但新连接不生效
ThinkPHP 6 默认会缓存配置(包括数据库配置),修改 .env 后必须清空运行时缓存,否则新连接名根本不会被读取。
执行以下命令之一:
php think clear:configphp think clear:runtime- 手动删掉
runtime/config/目录下的所有文件
另外检查是否误用了连接名大小写:TP6 的连接名区分大小写,mysql_primary 和 Mysql_Primary 是两个不同连接,而 .env 键名必须全大写,所以连接名要严格对应小写形式。
多连接下事务和连接复用要注意什么
TP6 的事务默认绑定到当前连接,跨连接无法共用一个事务。比如你在 mysql_primary 上开启事务,然后切到 mysql_backup 执行操作,commit() 只会影响前者。
连接复用方面:
- 同一个连接名多次调用
Db::connect('xxx')返回的是同一个 PDO 实例(已复用) - 不同连接名之间完全隔离,不会共享连接池或事务状态
- 如果用到了读写分离配置(
read_host/write_host),那是另一套机制,和这里的多连接配置不兼容,别混用
最常被忽略的是:模型类里设了 $connection,但控制器里又用 Db::connect() 切换,两者互不影响——它们走的是不同实例路径,数据隔离是彻底的,但也意味着你得自己协调一致性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











