Yii2. Робота з кількома базами даних

15 вересня 2024 р. 13 egor

Простий приклад роботи з кількома базами даних у Yii framework 2.

Додаємо налаштування підключення до кількох БД у 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().

І наостанок, використовуйте з'єднання з декількома базами даних в одному застосунку з розумом, не треба робити різні бази для кожної таблиці, але, зі свого боку, і запихати безліч таблиць в одну базу (особливо в разі кардинальної відмінності сфери застосування) теж не варто.