Додаємо налаштування підключення до кількох БД у Yii2
Для роботи з декількома базами даних в Yii2, потрібно додати всі нові з'єднання в файл config/web.php:
<?php
'db' => require(__DIR__ . '/db.php'),
'myNewDB' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=my_new_database',
'username' => 'user',
'password' => 'password',
'charset' => 'utf8',
],
Також можна використовувати окремий файл для під'єднання нової бази даних, це робиться так:
<?php 'db' => require(__DIR__ . '/db.php'), 'myNewDB' => require(__DIR__ . '/myNewDB.php'),
Не перейменовуєте властивість "db" компонента, оскільки це призведе до помилки.
Вказуємо потрібну БД для використання в моделі Yii2
Для використання нової бази даних у моделі потрібно перевизначити конфігурацію "db", встановлену за замовчуванням, робимо це так:
<?php
class MyModel extends \yii\db\ActiveRecord {
//...
public static function getDb() {
return Yii::$app->get('myNewDB');
}
//...
}
Функція getDb встановлює потрібне нам з'єднання з БД для моделі.
Робота joinWith() для різних баз даних у Yii2
Отже, коли обидві таблиці знаходяться в одній базі даних, наприклад: Author (model \app\models\Author.php) та Post (model \app\models\Post.php) ми робимо так:
$authorsPosts = \app\models\Author::find()
->joinWith('post')
->where(['post.visibility' => \app\models\Post::STATUS_VISIBILITY])
->all();
Такий зв'язок для таблиць, що перебувають у різних базах даних, матиме такий вигляд:
$authorsPosts = \app\models\Author::find()
->joinWith(['order' => function($query) {
return $query->from('myNewDB.' . \app\models\Post::tableName())
->andWhere(['post.visibility' => \app\models\Post::STATUS_VISIBILITY]);
}])
->all();
При цьому таблиця Post з бази даних myNewDB (модель: \app\models\Order.php), використовує метод для налаштування з'єднання з базою даних getDB().
І наостанок, використовуйте з'єднання з декількома базами даних в одному застосунку з розумом, не треба робити різні бази для кожної таблиці, але, зі свого боку, і запихати безліч таблиць в одну базу (особливо в разі кардинальної відмінності сфери застосування) теж не варто.


