我有一个Yii2项目,此应用程序应在许多数据库之间传输数据并应同时连接到它们。
问题是从用户发送了正确的数据库(是在用户的请求中),并且我不想在应用程序的开头连接到所有数据库,原因有两个:
所以我应该在控制器中创建一个数据库连接。我无法在raw php
中创建连接,因为我想将连接传递给某些模型,并且我的模型应该使用新的数据库传输数据。
换句话说,我想从一个模型创建实例,但是要有多个数据库。
我试图像这样将db添加到我的项目中,但是会抛出can not add property to Component or App
。
这些是我的无效代码:
Yii::$app->db2 = [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=databasename',
'username' => 'username',
'password' => 'pass',
'charset' => 'utf8',
];
和
Yii::$app->components->db2 = [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=databasename',
'username' => 'username',
'password' => 'pass',
'charset' => 'utf8',
];
答案 0 :(得分:3)
要访问数据库,还可以在不使用应用程序组件的情况下建立数据库连接,在这种情况下,您首先需要通过创建yii \ db \ Connection实例来连接到数据库:
$yourdb = new yii\db\Connection([
'dsn' => 'mysql:host=localhost;dbname=example',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
]);
您可以访问数据库,例如:
$posts = $db->createCommand('SELECT * FROM post')->queryAll();
https://www.yiiframework.com/doc/guide/2.0/en/db-dao#creating-db-connections
答案 1 :(得分:0)
在配置文件中,将取决于您使用的模板,对于config/db.php
中的基本模板,高级模板将为/common/config/main-local.php
。为每个数据库内部组件创建两个数组,例如:
'components' => [
'db1' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=db',
'username' => 'username',
'password' => 'pass',
'charset' => 'utf8',
],
'db2' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=whateveritscalled;dbname=db2',
'username' => 'user',
'password' => 'pass',
'charset' => 'utf8',
],
]
];
那么您应该能够像这样访问它们:
Yii::$app->db1->createCommand()
Yii::$app->db2->createCommand()
答案 2 :(得分:0)
您需要使用Application::set()
来以这种方式配置组件:
Yii::app->set('db2', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=databasename',
'username' => 'username',
'password' => 'pass',
'charset' => 'utf8',
]);
Yii::$app->db2->createCommand($sql)->execute();
还要注意Yii使用延迟加载来初始化组件。即使您配置了数据库连接组件,只要您不使用该组件,它也不会被初始化并且连接也不会打开。因此,您可以安全地配置1000个DB组件(db1, db2, ... db1000
),并仅使用一个-其他999个组件将不会初始化,并且仅打开一个DB连接。
但是,如果您有如此大量的数据库,则可以考虑创建某种DbManager
来存储所有可用的连接配置并根据请求初始化连接(例如Yii::$app->dbManager->get('123'); // <- returns connection nr 123
)-应该更多比注册额外的数千个组件更干净,而且绝对比在控制器中设置数据库连接组件更干净。