连接数据库
数据库对象池概念
MiniFramework 支持数据库对象(实例)池技术,允许开发者在同一个应用内灵活配置多组数据库配置信息,以满足同时操作主/从数据库这类场景需求。
自动初始化数据库对象池
MiniFramework 会在常量 DB_AUTO_CONNECT
的值为 TRUE
时,自动将数据库配置文件中的全部数据库信息初始化(逐一实例化)到数据库对象池中。
配置数据库连接参数
数据库连接参数应配置在 Config/database.php 文件中,例如:
<?php
/**
* 数据库配置
*/
return [
'db1' => [
'host' => 'localhost', //主机地址
'port' => 3306, //端口
'dbname' => 'db1', //库名
'username' => 'root', //用户名
'passwd' => '', //密码
'charset' => 'utf8', //字符编码
'persistent' => false //是否启用持久连接
],
'db2' => [
'host' => 'localhost', //主机地址
'port' => 3306, //端口
'dbname' => 'db2', //库名
'username' => 'root', //用户名
'passwd' => '', //密码
'charset' => 'utf8', //字符编码
'persistent' => false //是否启用持久连接
]
];
自动连接
MiniFramework 自动连接数据库功能默认是关闭的,如需使用,请在你的应用入口文件 Public/index.php 中定义常量 DB_AUTO_CONNECT
的值为 TRUE
,来开启这个功能,例如:
const DB_AUTO_CONNECT = true;
MiniFramework 会在常量
DB_AUTO_CONNECT
的值为TRUE
时,自动将配置文件中的全部数据库信息初始化(逐一实例化)到数据库对象池中。
接下来,就可以在 Model 中通过 $this->useDb()
方法切换要使用的数据库实例了,例如:
重要提示:MiniFramework 从 2.11.0 版本开始,将原 Mini\Base\Model 类中的数据库操作方法全部迁移至新增的 Mini\Db\Query 查询构造类中。同时,为了确保使用 MiniFramework 的各位开发者升级到 2.11.0 版本后项目运行正常,在 Mini\Base\Model 类中,继承了 Mini\Db\Query 类,原有的方法均可正常调用,不受影响。(新增的 Mini\Db\Query 类也可独立调用。)
namespace App\Model;
use Mini\Base\Model;
class User extends Model
{
public function getUser()
{
// 使用 KEY 为 db1 的数据库实例
$this->useDb('db1');
// 查询 db1 中的 user1 表
$users1 = $this->from('user2')->select();
// 切换 KEY 为 db2 的数据库实例
$this->useDb('db2');
// 查询 db2 中的 user2 表
$users2 = $this->from('user2')->select();
// do something...
}
}
提示:MiniFramework 的数据库自动连接功能,采用的是惰性连接机制,只会在下达了执行 SQL 语句命令时,才真正开始与数据库通讯建立连接,因此,你不必为开启自动连接功能而担心应用的性能问题。
手动连接
如果 DB_AUTO_CONNECT
的值为 FALSE
(默认值)时,MiniFramework 不会自动初始化数据库对象池,使用数据库前,需要开发者编写代码,在 Model 中用 $this->regDb()
方法手动向数据库对象池进行注册,同时也可用 $this->useDb()
方法带上数据库配置参数进行自动注册,方法如下:
namespace App\Model;
use Mini\Base\Config;
use Mini\Base\Model;
class User extends Model
{
public function getUser()
{
// 读取数据库配置信息
$dbParams = Config::getInstance()->load('database');
// 注册 db1
$this->regDb('db1', $dbParams['db1']);
// 使用 KEY 为 db1 的数据库实例
$this->useDb('db1');
// 查询 db1 中的 user1 表
$users1 = $this->from('user2')->select();
// useDb 支持带参数自动注册
// 相当于先调用了一次 regDb
$this->useDb('db2', dbParams['db2']);
// 查询 db2 中的 user2 表
$users2 = $this->from('user2')->select();
// do something...
}
}