多个数据库连接和Yii 2.0

Chh*_*oro 55 yii2

我有两个数据库,每个数据库都有相同字段的相同表,但如何在Yii 2.0中同时获取所有两个数据库中的所有记录?

Ali*_*our 104

首先,您需要配置您的数据库,如下所示:

return [
'components' => [
    'db1' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,...
        'username' => 'db1username',
        'password' => 'db1password',
    ],
    'db2' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db2name', // Maybe other DBMS such as psql (PostgreSQL),...
        'username' => 'db2username',
        'password' => 'db2password',
    ],
],
];
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地说:

// To get from db1
Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()

// To get from db2
Yii::$app->db2->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
Run Code Online (Sandbox Code Playgroud)

如果您使用的是活动记录模型,则可以在模型中定义:

public static function getDb() {
    return Yii::$app->db1;
}

//Or db2
public static function getDb() {
    return Yii::$app->db2;
}
Run Code Online (Sandbox Code Playgroud)

然后:

如果已db1getDb()方法中设置,则将从中获取结果db1,依此类推.

ModelName::find()->select('*')->all();
Run Code Online (Sandbox Code Playgroud)

  • 提前感谢您的回答.这真的很有帮助. (3认同)
  • 使用您的代码时出现错误。这并非完全错误,但我认为你错过了一些东西。您在返回 [ 后遗漏了 "'class' => 'yii\db\Connection'" (2认同)
  • 应该是`public static function getDb()`use**static**,因为它是覆盖静态方法. (2认同)

DrB*_*row 19

只是添加:我按照提供的答案但仍然出现错误:"未知组件ID:db"

经过一些测试,这里就是我发现:该功能getDB只调用建立连接到数据库.因此,您无法在配置文件中删除或重命名"db".相反,你需要让'db'的调用正常进行,然后再覆盖它.

解决方案(对我来说)如下:

在下面config/web.php添加第二个数据库配置db,如下所示:

'db' => require(__DIR__ . '/db.php'),
'db2' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=name',
    'username' => 'user',
    'password' => 'password',
    'charset' => 'utf8',
    'on afterOpen' => function ($event) {
        $event->sender->createCommand("SET time_zone = '+00:00'")->execute();
    },
],
Run Code Online (Sandbox Code Playgroud)

不要重命名db.找不到db会导致错误.你可以db2说出你喜欢的名字.

现在在模型中,添加以下代码:

class ModelNameHere extends \yii\db\ActiveRecord {

   // add the function below:
   public static function getDb() {
       return Yii::$app->get('db2'); // second database
   }
Run Code Online (Sandbox Code Playgroud)

现在,它将覆盖默认db配置.

我希望能帮助别人.

注意:您可以将配置包含db2在另一个文件中,但不能将其包含在db.php文件中(显然).相反,创建一个名为的文件db2.php并像以下一样调用它db:

'db' => require(__DIR__ . '/db.php'),    
'db2' => require(__DIR__ . '/db2.php'),
Run Code Online (Sandbox Code Playgroud)

谢谢