首页 > 解决方案 > Yii2 多数据库连接:根据登录用户 id、运行时选择数据库

问题描述

这是我的场景。

我在“主”数据库中有一个使用我的应用程序的所有诊所的列表。在“主”中,每个诊所的信息都在一个表中,该表还包含数据库名称、数据库的用户名和密码的列。每一个的模式结构都是相同的。

所有这些诊所都将使用我目前在 Yii2 中开发的单一源代码。我需要的是在登录的时候,自动选择相应的数据库,所有的交易,都必须在数据库中。

我尝试在会话中保存数据库名称。

$db_name = "main";

if( isset($_SESSION['db']) ){
    $db_name = $_SESSION['db'];
}
$config = [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname='.$db_name,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ],
    ],
];

它不起作用我无法访问 config/main.php 中的会话。

我无法解决问题,因为所有诊所都有相同的 SERVER_NAME。动态更改数据库连接

标签: yii2yii2-advanced-app

解决方案


如果您有一个“主”数据库,然后将主数据库连接记录用于第二个数据库:最好将 db2 配置为 NULL 数据库连接,然后:

'db' => $db, // default...,
'db2' => [
    // Fill with null values
],

Yii::$app->db2->dsn= 'DSN';
Yii::$app->db2->username = 'username';
# password...

另外,首先关闭 db2 连接。close().一定要销毁

这个链接也有一个好方法。动态数据库连接

或尝试以下操作

'db2' => function () {
    if (!\Yii::$app->user->isGuest) {
        $db_name = \Yii::$app->user->getid();
    } else {
        $db_name = ..; params
    }

    return Yii::createObject([
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=' . $db_name,
        'username' => 'root',
        'password' => '',
        'charset' => 'utf8',
    ]);
},

然后:

public static function getDb()
{
    return Yii::$app->userDb;
}

当然,对于db(默认db),它可能不起作用。但是如果经过测试..,请务必关闭(),之前的连接/


推荐阅读