ThinkPHP 5.1 支持通过 database.php 中定义多组独立配置项(如 database2、report_db)实现多数据库,各配置结构与 default 一致;使用 Db::connect('key') 切换数据源,模型可通过 $connection 属性或 self::connect() 绑定指定库。

ThinkPHP 5.1 支持在 database.php 中配置多个数据库,核心是通过**多组独立配置项**实现,而不是覆盖默认配置。框架本身不强制命名规则,但推荐用语义化键名(如 database1、database2 或 mysql_master、mysql_slave)区分用途。
在 database.php 中定义多个数据库配置
打开 config/database.php,返回数组中直接添加多个配置项,每个为完整的一套连接参数:
- 保持原有
'default'配置不变(供主库使用) - 新增自定义键名的配置,例如
'database2'、'log_db'、'report_db' - 每组配置结构与 default 完全一致:包含
type、hostname、database、username、password等必需字段
示例片段:
return ['default' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'thinkphp_main',
'username' => 'root',
'password' => '',
],
'database2' => [
'type' => 'mysql',
'hostname' => '192.168.1.10',
'database' => 'thinkphp_log',
'username' => 'logger',
'password' => 'log123',
],
'report_db' => [
'type' => 'mysql',
'hostname' => '192.168.1.20',
'database' => 'thinkphp_report',
'username' => 'reporter',
'password' => 'rep456',
],
];
代码中调用指定数据库配置
使用 Db::connect() 方法传入配置键名或完整数组,即可切换数据源:
-
按键名调用:
Db::connect('database2')—— 自动读取config('database2') -
按完整数组调用:
Db::connect(config('report_db')) -
DSN 字符串方式(不依赖 config 文件):
Db::connect('mysql://user:pass@host:port/dbname#utf8')
后续操作与默认 Db 实例一致,例如:
$logs = $logDb->table('sys_log')->where('status', 1)->select();
配合模型使用多数据库
如果使用模型类(如 app\model\LogRecord),可在模型内重写 initialize() 方法指定连接:
- 调用
self::connect('database2')绑定当前模型到指定库 - 或在模型属性中设置
protected $connection = 'database2';(需 TP 5.1.35+ 支持)
注意:模型未显式指定时,默认使用 default 配置。
注意事项与常见问题
多数据库配置虽灵活,但需规避几个典型问题:
- 配置键名不能为
default以外的保留字(如type、params),否则可能被框架误解析 - 不同数据库间无法直接跨库 JOIN(除非底层 MySQL 支持且表名写全
db_name.table_name) - 事务仅对单个连接有效;跨库操作需手动协调,不支持统一 commit/rollback
- 调试模式下注意日志中 SQL 所属连接,避免误判执行库
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











