公司项目需要连接2个MySQL数据库
背景介绍: 公司项目是基于fastadmin 1.4.0.20230711 开发的,里面用到的thinkphp版本是5.0.25,项目涉及到小程序端和设备端,之前做的是两个项目,但是部署在同一台服务器上,分别对应两个数据库,之前两个项目之间的交互是通过互相调用对方接口的方式实现的,优化的时候就想通过在一个项目中连接两个MySQL数据库的方式,避免互相调用带来的性能开销.
在网上查了查thinkphp5.0中如何进行多数据库连接,有的能用有的不能用,这里记录一下方便有需要的同学别走弯路.
项目对应主数据库配置还是配置在application/database.php中
use think\Env;
return [
// 数据库类型
'type' => Env::get('database.type', 'mysql'),
// 服务器地址
'hostname' => Env::get('database.hostname', '127.0.0.1'),
// 数据库名
'database' => Env::get('database.database'),
// // 用户名
'username' => Env::get('database.username'),
// 密码
'password' => Env::get('database.password'),
// 端口
'hostport' => Env::get('database.hostport', '3306'),
]
项目模型中默认会使用database.php中的配置进行数据库连接.
项目中部分模型需要用到另外一个设备数据库,这个时候就要给这些模型指定另外一个数据库连接了,也就是本篇文章的重点,具体的操作步骤如下:
首先在application/config.php中编辑设备数据库的连接信息
return [ //其它配置.... //设备数据库连接信息配置 'devicedb' => [ // 数据库类型 'type' => Env::get('devicedb.type', 'mysql'), // 服务器地址 'hostname' => Env::get('devicedb.hostname', '127.0.0.1'), // 数据库名 'database' => Env::get('devicedb.database', ''), // // 用户名 'username' => Env::get('devicedb.username', ''), // 密码 'password' => Env::get('devicedb.password', ''), // 端口 'hostport' => Env::get('devicedb.hostport', '3306'), // 数据库表前缀 'prefix' => Env::get('devicedb.prefix', 'fa_'), // 数据库编码默认采用 utf8mb4 'charset' => Env::get('devicedb.charset', 'utf8mb4'), // 数据库调试模式 'debug' => Env::get('devicedb.debug', false), ] ];
可以看到无论是位于database.php中的默认数据库配置,还是在config.php中单独加的设备数据库devicedb对应的配置信息,都是从.env文件中读取的,只不过一个读取的是database配置部分另一个读取的是devicedb配置部分.
在模型中指定要使用的连接名称
namespace app\device\model; use think\Model; class DeviceModel extends Model { //配置连接参数 对应config.php中的devicedb配置 protected $connection = 'devicedb'; //对应数据表名 protected $name = 'device_lists'; //设置查询结果返回think\collection对象, 支持链式操作 protected $resultSetType = 'collection'; }
通过上面的配置之后,当使用DeviceModel模型的时候就会自动通过使用config.php中devicedb对应的配置信息来连接设备数据库进行操作.