我有一个Yii2项目,这个应用程序应该在多个数据库之间传输数据,并同时连接到它们。
问题是,正确的数据库是从用户发送的(在用户的请求中),我不想在应用程序开始时连接到所有数据库,原因有两个:
因此,我应该在控制器中创建一个DB连接。我无法在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',
];发布于 2018-08-16 11:34:25
要访问数据库,还可以在不使用应用程序组件的情况下构建db connect --在这种情况下,首先需要通过创建‘`yii\ db \Connection’实例连接到db:
$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
发布于 2018-08-16 15:28:07
在您的配置文件中,将取决于您正在使用的模板,对于config/db.php中的基本模板,高级模板将是/common/config/main-local.php。为每个db的内部组件创建两个数组,如:
'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()发布于 2018-08-17 11:31:32
您需要使用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使用延迟加载来启动组件。即使您配置了DB连接组件,只要您不使用它,这个组件也不会被初始化,连接也不会被打开。因此,您可以安全地配置1000 DB组件(db1, db2, ... db1000),并且只使用一个-其他999组件不会初始化,只会打开一个DB连接。
但是,如果您有这么多的数据库,您可以考虑创建某种DbManager,它将存储所有可用的连接配置,并根据请求初始化连接(如Yii::$app->dbManager->get('123'); // <- returns connection nr 123) --它应该比注册额外的1000个组件更干净,并且肯定比在控制器中设置DB连接组件更干净。
https://stackoverflow.com/questions/51875737
复制相似问题