thinkphp 5.1 多库配置须将所有连接定义在 database.php 的 connections 数组内,键名小写无特殊字符,每个连接必须显式声明 type;通过 db::connect('key') 或模型 protected $connection = 'key' 调用,传错键名报 connection not found。

database.php 里怎么定义多个连接
ThinkPHP 5.1 不支持在 database.php 的顶层直接写多个数据库配置;必须把额外连接收进 connections 数组,且键名要小写、无特殊字符。例如:
'connections' => [
'mysql_master' => [
'type' => 'mysql',
'hostname' => '192.168.1.10',
'database' => 'app_main',
'username' => 'root',
'password' => 'xxx',
'hostport' => '3306',
'charset' => 'utf8mb4',
'prefix' => 'tp_',
],
'mysql_log' => [
'type' => 'mysql',
'hostname' => '192.168.1.12',
'database' => 'app_log',
'username' => 'log_user',
'password' => 'yyy',
'hostport' => '3306',
'charset' => 'utf8',
'prefix' => '',
],
]
- 每个连接必须显式声明
type,漏掉会报Class 'PDO' not found或驱动识别失败 -
connections外层不能删掉默认的default连接配置(哪怕你不用),否则框架初始化时可能跳过整个数据库模块 - 改完记得运行
php think clear:config,否则缓存里的旧配置还在生效
Db::connect() 传什么参数才不报错
Db::connect() 的参数不是数据库名,也不是模型名,而是 connections 数组里的键名字符串。传错就直接抛 Connection not found: xxx。
- 正确用法:
Db::connect('mysql_log')→ 加载mysql_log连接配置 - 错误用法:
Db::connect('app_log')(这是库名,不是键名)、Db::connect('LogModel')(模型类名无效) - 大小写敏感:配置里是
mysql_slave,就不能传mysql_Slave或Mysql_slave - 返回的是独立
Query实例,和Db::table()、Model::get()完全无关,混用会导致查错库
模型类怎么绑定指定连接
模型固定走某个库,靠 protected $connection 属性,值为 connections 中的键名。这个值只在模型类首次加载时读取一次,运行中改配置也不会刷新。
- 示例:
protected $connection = 'mysql_log'; - 关联查询(
with())不会自动继承父模型的$connection,被关联的模型仍按自己的$connection走 —— 如果没设,就走默认连接 - 不要在构造函数或
initialize()里动态赋值$connection,TP5.1 不支持运行时切换模型连接 - 如果模型要跨租户动态换库,得放弃
$connection,改用Db::connect($config)手动查,再手动组装数据
.env 和多环境配置怎么避免踩坑
TP5.1 原生不支持 .env 自动加载 database 配置,硬塞进去会被忽略。真要环境分离,得手动合并配置文件。
- 推荐结构:
config/database.php只留type、params等不变项;config/database_dev.php和config/database_prod.php分别放 host、database、user 等变量 - 在
app/common.php末尾加合并逻辑:if (is_file(CONF_PATH . 'database_' . APP_ENV . '.php')) { Config::set(include CONF_PATH . 'database_' . APP_ENV . '.php', 'database'); } -
APP_ENV必须由.env提供,且文件必须 UTF-8 无 BOM、放在项目根目录;APP_ENV=dev不能写成app_env=dev或带空格 - 验证是否生效:
var_dump(Config::get('database.connections.mysql_log.hostname')),别只看文件里有没有写
with() 查关联表时,两个模型各连各的库,结果查出来空数据,却以为是 SQL 写错了。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











