thinkphp多数据库连接必须在config/database.php的connections数组中预定义两个合法连接名(如mysql_main、log_db),显式配置type、hostname、database等完整参数,键名仅支持小写字母和下划线;使用db::connect('name')获取独立query实例,事务和查询不跨连接。

直接用 Db::connect() 分别加载两个预定义连接名,不能靠改配置或传数组硬凑。
database.php 里必须提前配好两个完整连接
ThinkPHP 不支持运行时“临时拼一个新库”,所有多库操作都依赖 config/database.php 中 connections 数组里已声明的连接。漏写、拼错键名、少填 type 或 database 都会失败。
- 连接键名只能是小写字母 + 下划线(如
mysql_main、log_db),不能含点号或大写 - 每个连接必须显式写全
'type' => 'mysql',否则框架无法加载驱动,报Class 'PDO' not found - 字符集不一致时(比如主库
utf8mb4、日志库gbk),必须各自配'charset' => 'utf8mb4',否则中文插入被截断 - 改完记得清缓存:
php think clear:config,否则新配置不生效
控制器里用 Db::connect('name') 拿两个独立 Query 实例
每次调用 Db::connect() 都返回一个全新、隔离的 Query 对象,互不影响。它不会改变全局默认连接,也不共享事务上下文。
- 正确写法:
$main = Db::connect('mysql_main');和$log = Db::connect('log_db'); - 错误写法:
Db::connect('user_db')(键名不存在)、Db::connect(['hostname'=>'...'])(高并发下耗尽 MySQL 连接数) - 查数据:
$main->table('user')->where('id', 1)->find();写日志:$log->table('op_log')->insert($data) - 事务只能在单个连接内生效,
$main->startTrans()和$log->startTrans()是两套独立事务
模型类里不能靠 $connection 自动跨库关联
即使你在两个模型里分别设了 protected $connection = 'mysql_main' 和 protected $connection = 'log_db',调用 User::with('log') 也不会自动切到日志库——with() 查的是 Log 模型自己的 $connection,但主模型的查询仍走它自己的连接,两者不联动。
- 跨库 JOIN 不被支持,
$main->table('user')->join('log_db.log', ...)会报错或连错库 - 想组合数据,得手动分两次查:
$user = $main->table('user')->find();→$logs = $log->table('log')->where('user_id', $user['id'])->select(); - 模型的
$connection只在类首次加载时读取一次,运行中改配置不会刷新
最易忽略的一点:两个连接若指向同一台 MySQL 服务器但不同库,仍要配不同 hostname(哪怕都是 127.0.0.1)和完整凭据,不能只复制 default 配置改个 database 就完事——否则可能连上同一个库,导致写错表。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











