thinkphp多数据库配置必须在config/database.php的connections数组中完整定义各库连接,键名唯一小写、type字段不可省略,db::connect()仅认该数组中的键名,改完需执行php think clear:config刷新缓存。

ThinkPHP 连接多个数据库,配置文件必须把所有库都写进 connections 数组里,不能靠复制多个 database.php 文件,也不能只改 default。
config/database.php 中 connections 数组必须完整定义每个连接
每个连接是一个独立键值对,键名(如 mysql、log_db)必须唯一、小写、不含特殊字符;值是完整配置数组,type 字段不可省略,否则框架无法加载驱动。
-
type必须显式写成'mysql'、'pgsql'或'sqlsrv',写错会直接报Class 'PDO' not found - 所有连接共用同一份结构,不能为某个库少写
charset或hostport,否则在某些环境(如 Docker)下会静默失败 - 敏感字段(如
password)应通过env()读取,例如'password' => env('LOG_DB_PASSWORD', '') - 改完必须执行
php think clear:config,否则缓存未更新,新连接名始终提示Connection not found
Db::connect() 的参数只能是 connections 里的键名,不是数据库名或模型名
调用时传入的字符串,必须和 connections 数组的 key 完全一致,大小写、下划线都不能错。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 正确:
Db::connect('log_db')→ 加载connections['log_db']配置 - 错误:
Db::connect('db_log')→ 报Connection not found: db_log - 错误:
Db::connect('UserLog')或Db::connect('user_log')→ 键名不存在,和表名/模型名无关 - 临时传数组也行:
Db::connect(['type'=>'sqlite','database'=>'/tmp/test.db']),但不走连接池,高并发下容易耗尽 MySQL 连接数
模型类用 $connection 属性绑定时,值必须是键名,且只在初始化时读取一次
模型中写 protected $connection = 'slave_db'; 是最常用方式,但要注意它的生效时机和边界。
- 这个属性值只在模型类第一次被实例化时读取,后续修改配置文件或运行时重设
$connection都不会自动刷新 -
with()关联查询默认仍走当前模型的$connection,不会自动跳转到关联模型声明的连接上 - 如果需要按请求动态切换(比如多租户),不能靠写死
$connection,得用中间件提前注册连接,再通过Db::setConnectConfig()注入 - TP6.1+ 支持在模型方法内用
$this->db()->connect('xxx')覆盖当前连接,但仅限本次查询生效
最容易被忽略的是:default 字段只影响未显式指定连接时的兜底行为,它本身不参与多库逻辑;而 connections 以外的任何地方写的数据库配置(比如单独加个 log_database 顶层字段),框架完全无视。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










