Добавляем настройки подключения к нескольким БД в 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().
И напоследок, используйте соединение с несколькими базами данных в одном приложении с умом, не надо делать разные базы для каждой таблицы, но в свою очередь и запихивать множество таблиц в одну базу (особенно при кардинальном отличии области применения) тоже не стоит.
Комментарии
Комментарии отсутствуют, Вы можете быть первым