在其他情况下,项目需要连接多个数据库也是常见的需求。解决方案可以有多种,简单的方案,可以通过配置直接实现,但有一定局限性。复杂的方案,能解决更多应用场景遇到的问题并能更好满足约束限制。
这一章,将带你开启一段组合爆炸的神奇旅程。但本质就看实际有多少个数据库,以及最终有多少个NotORM实例。请记住这个经验法则:
一个数据库,对应一个NotORM实例;但一个NotORM实例可以对应多个数据库。
首先,通过./config/dbs.php的简单配置,就能实现连接多个数据库。
假设我们有两个数据库:第一个数据库:db_1
第二个数据库:db_1
假设都是MySQL数据库,按前面介绍的格式,则可以在./config/dbs.php文件中配置:
return array(
/**
* DB数据库服务器集群
*/
'servers' => array(
// 第一个数据库
'db_master' => array( //服务器标记
'host' => '127.0.0.1', //数据库域名
'name' => 'db_1', //数据库名字
'user' => 'root', //数据库用户名
'password' => '', //数据库密码
'port' => 3306, //数据库端口
'charset' => 'UTF8', //数据库字符集
),
// 第二个数据库
'db_other' => array( //服务器标记
'host' => '192.168.1.100', //数据库域名
'name' => 'db_2', //数据库名字
'user' => 'root', //数据库用户名
'password' => '', //数据库密码
'port' => 3306, //数据库端口
'charset' => 'UTF8', //数据库字符集
),
),
// 略……
第二步,再继续配置,不同的数据库表使用哪个数据库。参考分表配置的格式,只是这里是一个极端,即全部的分表只都有一张表,可以这样配置:
'tables' => array(
// 库表:db_1.user
'user' => array(
'prefix' => 'tbl_',
'key' => 'id',
'map' => array(
array('db' => 'db_master'),
),
),
// 库表:db_2.log
'log' => array(
'prefix' => 'tbl_',
'key' => 'id',
'map' => array(
array('db' => 'db_other'),
),
),
),
上面配置,分别配置了user用户表用db_1,log日志表用db_2。其他依此类推。
最后,在Model层编写的代码和平时一样即可。
namespace App\Model;
use PhalApi\Model\NotORMModel as NotORM;
class User extends NotORM {
public function count() {
// user表查db_1
return $this->getORM()->count();
}
}