公司項目需要連接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對應的配置信息來連接設備數據庫進行操作.