首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在控制器中添加数据库到app Yii2?

问如何在控制器中添加数据库到app Yii2?
EN

Stack Overflow用户
提问于 2018-08-16 11:15:55
回答 3查看 471关注 0票数 0

我有一个Yii2项目,这个应用程序应该在多个数据库之间传输数据,并同时连接到它们。

问题是,正确的数据库是从用户发送的(在用户的请求中),我不想在应用程序开始时连接到所有数据库,原因有两个:

  1. 数据库数量是巨大的
  2. 在某些请求中,连接到一个数据库就足够了,连接到所有这些请求都是无用的,可能会影响进程的速度。

因此,我应该在控制器中创建一个DB连接。我无法在raw php中创建连接,因为我想将连接传递给我的一些模型,并且我的模型应该使用新的数据库传输数据。

换句话说,我想从一个模型中创建实例,但是要使用多个数据库。

我试图像这样将db添加到我的项目中,但是它会抛出can not add property to Component or App。

这些是我的密码没用的:

代码语言:javascript
复制
 Yii::$app->db2 = [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=databasename',
    'username' => 'username',
    'password' => 'pass',
    'charset' => 'utf8',
];

和

代码语言:javascript
复制
 Yii::$app->components->db2 = [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=databasename',
    'username' => 'username',
    'password' => 'pass',
    'charset' => 'utf8',
];
EN

回答 3

Stack Overflow用户

发布于 2018-08-16 11:34:25

要访问数据库,还可以在不使用应用程序组件的情况下构建db connect --在这种情况下,首先需要通过创建‘`yii\ db \Connection’实例连接到db:

代码语言:javascript
复制
  $yourdb = new yii\db\Connection([
      'dsn' => 'mysql:host=localhost;dbname=example',
      'username' => 'root',
      'password' => '',
      'charset' => 'utf8',
  ]); 

您可以访问数据库,例如:

代码语言:javascript
复制
$posts = $db->createCommand('SELECT * FROM post')->queryAll();

https://www.yiiframework.com/doc/guide/2.0/en/db-dao#creating-db-connections

票数 3
EN

Stack Overflow用户

发布于 2018-08-16 15:28:07

在您的配置文件中,将取决于您正在使用的模板,对于config/db.php中的基本模板,高级模板将是/common/config/main-local.php。为每个db的内部组件创建两个数组,如:

代码语言:javascript
复制
'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',
    ],
 ]
];

那么,您应该能够访问它们,例如:

代码语言:javascript
复制
Yii::$app->db1->createCommand()

Yii::$app->db2->createCommand()
票数 0
EN

Stack Overflow用户

发布于 2018-08-17 11:31:32

您需要使用Application::set()以这种方式配置组件:

代码语言:javascript
复制
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连接组件更干净。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51875737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档