У меня есть две базы данных, и каждая база данных имеет одну и ту же таблицу с одинаковыми полями, но как я могу получить все записи из всех двух баз данных одновременно в Yii 2.0?
Несколько соединений с базой данных и Yii 2.0
Ответ 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'),
Спасибо