yii2 - 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。动态更改数据库连接
解决方案
如果您有一个“主”数据库,然后将主数据库连接记录用于第二个数据库:最好将 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),它可能不起作用。但是如果经过测试..,请务必关闭(),之前的连接/
推荐阅读
- python - 无法解析嵌套字符串模板
- sql - 如何使用上面的总和更新每个 fatura_id 的 valor_total
- python - 显示数据帧 Tkinter 子集的下拉选项
- google-apps-script - 在自定义函数中寻求帮助,返回可能溢出的二维数组
- javascript - 无法在 http 拦截器上分配此值
- flutter-listview - 如何使用颤振创建类别分隔的列表视图构建器
- javascript - 多维浮点数组的正则表达式。每个数组值后匹配空格或无空格
- javascript - 循环遍历Vuejs中的对象数组以获取HTML选择标签
- c# - 字典 TryGetValue 输出参数
- php - Laravel 6 mutator 没有将 null 转换为空字符串