tp3.2里头怎么搞多个数据库连接,方便管理数据不那么死板
- 问答
- 2025-12-28 08:01:54
- 2
在ThinkPHP3.2这个老版本的框架里,想要灵活地使用多个数据库,不让代码写死,主要得从配置文件和一些小技巧上下功夫,核心思想就是把数据库的连接信息变成可以随时切换的,而不是固定在模型的代码里。
最基础也是最常用的方法,就是在项目的配置文件里直接定义多个数据库连接信息。
ThinkPHP3.2的主配置文件通常是 Application/Common/Conf/config.php,在这个文件里,有一个专门用来配置数据库的选项,叫 DB_CONFIG,默认情况下,它可能只配置了一个数据库,像这样:

'DB_CONFIG' => array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '123456',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'main_database',
),
要搞多个连接,很简单,就是把它变成一个数组,给每个连接起个名字,我们有一个主数据库(存用户信息等核心数据),一个从数据库(可能存一些日志或者业务数据)。
'DB_CONFIG' => array(
'db_main' => array( // 给这个连接起名叫 db_main
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '123456',
'db_host' => '192.168.1.100',
'db_port' => '3306',
'db_name' => 'main_database',
),
'db_log' => array( // 给这个连接起名叫 db_log
'db_type' => 'mysql',
'db_user' => 'log_user',
'db_pwd' => '654321',
'db_host' => '192.168.1.101',
'db_port' => '3306',
'db_name' => 'log_database',
),
),
配置好之后,在模型(Model)里怎么用呢?就不是用默认的连接了,在你自定义的模型类里,通过 $connection 属性来指定你要用哪个配置,我们有一个专门操作日志的模型 LogModel:
namespace Home\Model;
use Think\Model;
class LogModel extends Model {
// 关键就在这里,指定这个模型使用配置文件里的 'db_log' 这个数据库连接
protected $connection = 'DB_CONFIG:db_log'; // 格式是 '配置项名:连接名'
// 这个模型里的所有数据库操作,都会自动去连 db_log 对应的那个数据库
}
而对于默认操作主数据库的模型,你什么都不用写,框架会自动使用配置数组中第一个配置(也就是 db_main),或者你也可以显式地写成 protected $connection = 'DB_CONFIG:db_main';,这样更清晰。

如果情况更复杂,需要动态切换,比如根据用户身份连不同的数据库,那就要用更灵活的方法。
ThinkPHP3.2的模型类提供了一个 db 方法,可以在运行时动态切换数据库连接,这个方法非常强大,它允许你传入一个数组,数组里就是临时的数据库连接信息。
举个例子,假设有个功能是管理多个租户的数据,每个租户的数据存在不同的数据库里,但表结构一模一样,我们可以在控制器里这样写:

$tenant_id = I('get.tenant_id'); // 获取租户ID
// 根据租户ID,从某个配置里查出对应的数据库信息,这里假设我们已经拿到了
$tenant_db_config = array(
'db_type' => 'mysql',
'db_user' => 'tenant_user',
'db_pwd' => 'password',
'db_host' => 'localhost',
'db_port' => '3306',
'db_name' => 'tenant_db_' . $tenant_id, // 数据库名根据租户ID变化
);
// 获取模型实例
$UserModel = M('User'); // 这个User模型本身可能没有定义$connection,或者定义的是默认库
// 关键操作:动态切换连接
$UserModel->db(1, $tenant_db_config); // 第一个参数1通常表示选择主库(在分布式支持中),这里我们主要用第二个参数传配置
// 用这个模型进行查询,操作的就是 tenant_db_123 这个数据库里的 user 表了
$userList = $UserModel->select();
这种方式的灵活性最高,你可以根据任何业务逻辑来组装数据库连接信息,然后临时赋给模型,但缺点是每次都要写配置数组,有点麻烦,而且容易出错,通常会把租户的数据库配置信息也存到一张表或一个缓存里,用时再取。
还有一种场景是读写分离。 ThinkPHP3.2本身是支持数据库读写分离的,这其实也是一种多数据库连接的管理方式,它的配置更“自动化”一些,你可以在数据库配置里这样写:
'DB_CONFIG' => array(
'db_type' => 'mysql',
'db_user' => 'root',
'db_pwd' => '123456',
'db_host' => '192.168.1.100,192.168.1.101,192.168.1.102', // 第一个地址默认是主库,后面的是从库
'db_name' => 'main_database',
'db_deploy_type' => 1, // 开启分布式部署(支持读写分离)
'db_rw_separate' => true, // 开启读写分离
),
这样配置后,框架在执行写操作(如add, save, delete)时会自动连接主库(第一个地址),在执行读操作(如select, find)时会随机连接从库(后面的地址),这对于减轻主库压力很有用,而且对代码几乎是透明的,你不需要在模型里做任何特殊处理,框架帮你管理了这些连接。
在TP3.2里搞多个数据库连接,让管理不死板:
- 静态配置多个:在
config.php里用数组定义好不同的连接,模型里用$connection属性绑定,这是最清晰、最推荐的方式,适合连接目标固定的场景。 - 运行时动态切换:使用模型的
db方法,临时传入数据库配置信息,最灵活,适合数据库连接需要根据业务逻辑变化的复杂场景。 - 内置读写分离:利用框架自带的读写分离功能,配置主从库地址,由框架自动调度,适合有明确读写分离需求的性能优化场景。
选择哪种方式,就看你的实际项目需求了,简单项目用第一种,复杂多变的用第二种,要做高并发优化可以考虑第三种。
本文由革姣丽于2025-12-28发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/69916.html
