Додаємо налаштування підключення до кількох БД у 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().
І наостанок, використовуйте з'єднання з декількома базами даних в одному застосунку з розумом, не треба робити різні бази для кожної таблиці, але, зі свого боку, і запихати безліч таблиць в одну базу (особливо в разі кардинальної відмінності сфери застосування) теж не варто.