YII2 создание отношений в моделях между таблицами из 2 баз данных

Я определил 2 базы данных, например

return [
'components' => [
    'db1' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db1name', 
        'username' => 'db1username',
        'password' => 'db1password',
    ],
    'db2' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db2name', 
        'username' => 'db2username',
        'password' => 'db2password',
    ],
],
];

Теперь у меня есть таблица «пользователи» в «db1» и таблица «страны» в «db2».

users 
id , country_code , username , password
1  , DE           , xyz      , 12345
2  , FR           , abc      , 12345

countries
code , name
DE   , Germany
FR   , France
IN   , India

Я определил отношение внешнего ключа между пользователями.country_code и country.code.

ПРОБЛЕМА

Но когда я пытаюсь создать модель для таблицы «пользователи» с помощью gii, это дает ошибку, возможно, потому, что отношения таблиц взяты из двух разных баз данных. Как использовать таблицы из разных баз данных в отношениях модели.

Любые предложения приветствуются


person nshah143    schedule 05.04.2016    source источник
comment
Я думаю, что gii использует соединение с базой данных, которое хранится в db. Таким образом, это создает ошибку (например, эту).   -  person robsch    schedule 05.04.2016
comment
Это может помочь. Вы должны перезаписать getDb() в ваших классах моделей.   -  person robsch    schedule 05.04.2016
comment
Привет, robsch, я уже проверил предоставленные вами ссылки, но если вы можете сообщить мне, как создать оператор соединения, когда задействовано несколько БД, для таблиц в одном БД это что-то вроде этого - 'joinrel'=›array(self: :BELONGS_TO,'Пользователь','код'),   -  person nshah143    schedule 05.04.2016
comment
У вас уже есть код, который вы могли бы предоставить? В SQL таблицы должны иметь префикс с именами их баз данных для реальных соединений. Тогда это должно работать. Yii2 должен был это понять. Я ожидал, что это произойдет, если вы перезапишете getDb(). Согласно руководству. Я думал, что это будет довольно просто... Что вы уже закодировали и какую ошибку получили? Пожалуйста, обновите свой пост.   -  person robsch    schedule 05.04.2016
comment
Если вы хотите сгенерировать модель с помощью Gii, вы можете указать, какое соединение с базой данных использовать. По умолчанию это db, и вы должны написать db1. Leter, когда вы создаете свою модель с помощью Gii, вы можете написать запрос отношения в своей модели пользователя, и это отношение будет ссылаться на модель вашей страны.   -  person MrD    schedule 07.04.2016
comment
Вот скриншот pokit.org/get/?904453b2b0cdf61173385d1752e432d2.jpg   -  person MrD    schedule 07.04.2016
comment
Покажите нам задействованные классы моделей   -  person MacGyer    schedule 09.04.2016


Ответы (2)


В моем случае это работает, чтобы перечислить iten в GridView::widget

-> bd_sisarc is my secound data base
-> deposito_sondagem is a table from my first data base


public static function getDb()   // on your model
{
    return Yii::$app->get('db1');
}

public static function getDb()   // on your model
{
    return Yii::$app->get('db2');
}

public function getEmpresaSondagem()  // Relation on you model
{
    return $this->hasOne(EmpresaSondagem::className(), ['idEmpSondagem' => 'entidade_deposito']);
}





public function search($params)
{


    $this->load($params);

    $sql = "SELECT deposito_sondagem.*
                  FROM
                      deposito_sondagem,
                      `bd_sisarc`.`tbempresasondagem`
                  WHERE
                      `bd_sisarc`.`tbempresasondagem`.`idEmpSondagem`=`deposito_sondagem`.`entidade_deposito`

                      and deposito_sondagem.estado=1
                      and tbempresasondagem.estado=1
                      and numero_registo LIKE '%$this->numero_registo%'
                      and nomeempsondagem LIKE '%$this->nomeEntidade%'
                      and dono_sondagem LIKE '%$this->dono_sondagem%'
                      and data_deposito LIKE '%$this->data_deposito%'";


    $query = DepositoSondagem::findBySql($sql);
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);


    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }


    return $dataProvider;
}
person Ronilson Cardoso    schedule 12.09.2019

Попробуй это

SELECT `users`.* FROM `users` LEFT JOIN `db2name`.`countries` ON `users`.`country_code` = `db2name`.`countries`.`code `
person Annie Chandel    schedule 23.11.2016
comment
Он спрашивает, как создать модель, а вы говорите ему, как запрашивать данные. - person nicolascolman; 03.07.2017