连接数据库


数据库对象池概念

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...
    }
}