ThinkPHP6.0多数据库连接须严格遵循“预定义连接+显式调用”双约束:所有连接必须在config/database.php的'connections'中完整声明,键名小写加下划线;每个连接须含type、hostname、database、username、password五项,type值准确(如mysql、sqlsrv);修改后执行php think clear:config;运行时必须Db::connect('key')显式调用并赋值使用,模型需硬编码protected $connection = 'key';跨库操作用table('db.table'),事务与关联查询不跨连接。

ThinkPHP6.0 配置多数据库连接不是加几个数组就行,必须严格遵循“预定义连接 + 显式调用”双约束机制。漏掉任一环节,轻则查错库,重则报 Connection not found 或静默 fallback 到默认库。
在 config/database.php 中完整声明多个连接
所有连接都必须写在 config/database.php 的 'connections' 数组里,不能靠 .env 文件自动推导编号(如 database2.hostname),也不能运行时传数组替代。
- 键名只能是小写字母 + 下划线,例如 mysql_main、log_db;禁止出现大写(
LogDb)、点号(log.db)或数字开头 - 每个连接必须显式包含五项基础参数:
type、hostname、database、username、password;缺type会直接触发Class 'PDO' not found -
type值必须准确,如 MySQL 写mysql,SQL Server 写sqlsrv(不是pdo_sqlsrv),达梦写dm -
prefix强烈建议设为空字符串(''),跨库操作统一用table('db_name.table'),避免前缀拼接污染 - 改完配置后务必执行
php think clear:config清除缓存,否则新连接名在运行时不可见
运行时必须显式调用 Db::connect()
Db 是无状态门面,Db::connect('xxx') 返回的是一个全新 Query 实例,不赋值就丢弃,第二行继续走默认库——这是最常翻车的点。
- 正确写法:
Db::connect('log_db')->table('event')->select() - 或先赋值再用:
$logDb = Db::connect('log_db'); $logDb->table('event')->find(); - 错误写法:
Db::connect('log_db'); Db::table('event')->select();→ 第二行仍走default - 链式调用中慎加
->cache()、->useSoftDelete()等中间方法,某些场景可能意外复用默认连接上下文
模型绑定指定数据库连接
模型默认永远走 default 连接,必须硬编码指定才能生效,且该值只在类首次加载时读取一次,运行时修改无效。
- 在模型类顶部添加:
protected $connection = 'mysql_main'; - 该值必须与
connections数组中的键名完全一致(大小写敏感),写成'MysqlMain'或'mysql-main'都会静默回退到默认库 - 关联查询(
with())不会自动跨模型切换连接,被关联模型仍按自身$connection执行,不智能路由
跨库操作与特殊数据库适配要点
同一 MySQL 实例下不同库名是合法的,但 hostname/port/database 写错就会连空库或权限拒绝;不同数据库类型还有额外硬性要求:
- SQL Server:端口必须显式写
1433,不要加dsn字段;中文乱码需确认服务端排序规则与 PHP 传参编码匹配 - 达梦(DM):必须安装对应 PHP 版本的 TS 扩展(如
php81ts_dm.dll),表名默认大写,charset设为UTF-8,还需补全框架缺失的Builder类,否则 SQL 报错 - MySQL SSL 连接:SSL 参数只能放在
params数组里,用 PDO 常量作键名,例如'params' => [PDO::MYSQL_ATTR_SSL_CA => '/path/ca.pem'] - 事务与关联查询均不跨连接,一个事务内不能混用多个
Db::connect()实例
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











