Подтвердить что ты не робот

Несколько соединений с базой данных и Yii 2.0

У меня есть две базы данных, и каждая база данных имеет одну и ту же таблицу с одинаковыми полями, но как я могу получить все записи из всех двух баз данных одновременно в Yii 2.0?

4b9b3361

Ответ 1

Сначала вам нужно настроить свои базы данных, как показано ниже:

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',
    ],
],
];

Тогда вы можете просто:

// 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()

Если вы используете активную модель записи, в вашей модели вы можете определить:

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

//Or db2
public function getDb() {
    return Yii::$app->db2;
}

Тогда:

Если вы установили db1 в методе getDb(), результат будет получен из db1 и т.д.

ModelName::find()->select('*')->all();

Ответ 2

Просто добавьте: Я последовал за предоставленным ответом, но все еще получил ошибку: Msgstr "Неизвестный идентификатор компонента: db"

После некоторого тестирования, вот что я обнаружил: Функция getDB вызывается только ПОСЛЕ подключения к db. Поэтому вы не можете удалить или переименовать '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();
    },
],

НЕ переименуйте db. Ошибка при поиске db приведет к ошибке. Вы можете назвать db2 все, что вам нравится.

Теперь в модели добавьте следующий код:

class ModelNameHere extends \yii\db\ActiveRecord {

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

Теперь это переопределит конфигурацию по умолчанию db.

Я надеюсь, что это поможет кому-то другому.

Примечание. Вы можете включить конфигурацию для db2 в другой файл, но вы не можете включить ее в файл db.php (очевидно). Вместо этого создайте файл с именем db2.php и вызовите его, как вы делаете db:

'db' => require(__DIR__ . '/db.php'),    
'db2' => require(__DIR__ . '/db2.php'),

Спасибо