如何在控制器中将数据库添加到App Yii2?

时间:2018-08-16 11:15:55

标签: php yii2

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

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

  1. 数据库数量巨大
  2. 在某些请求中,连接到一个数据库就足够了,而连接到所有这些数据库都没有用,并且可能会影响处理速度。

所以我应该在控制器中创建一个数据库连接。我无法在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',
];

3 个答案:

答案 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)-应该更多比注册额外的数千个组件更干净,而且绝对比在控制器中设置数据库连接组件更干净。