Yii2 ActiveRecord Как сделать JOIN таблиц между двумя БД mysql?

Есть 2 модели KladrCity и Area, каждая из них находится в разных БД обе MYSQL.

В KladrCity
public static function getDb() {
        return \Yii::$app->dbKladr;
}


В Area
public function getCity()
{
        return $this->hasOne(KladrCity::className(), ['code' => 'city_id']);
}


При JOIN
$models = \common\models\Area::find()->joinWith('city');


Вываливается ошибка, что в DB нет таблицы city.
То есть при JOIN activerecord строит запрос без учета базы данных. В итоге запрос строится в ту базу в которой находится таблица к которой происходит JOIN.

Вот и возникает вопрос как в YII2 сделать JOIN двух таблиц из разных БД.
  • Вопрос задан
  • 1803 просмотра
Решения вопроса 1
@V_Tjuryakin
Перфекто
JOIN работает внутри вашей БД, он не может сделать это к другой базе данных. В таких случаях делается 2 запроса, выбираем все нужные area - на php как пример выбираем через array_unique - только уникальные city_id, делаем запрос к базе данных с city where in (city ids) - назначаем чтобы ключ массива был city_id, в любой момент получаем город для area по типу такого: $city[$area->city_id]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bitver
@bitver
ActiveRecord у Yii так намеренно не умеет, так как ломается совместимость с другими типами БД, где подобные JOIN не работают.
Разрабы советуют юзать with().
Расширенное использование из документации:
// find customers and bring back together their country and active orders
// SELECT * FROM `customer`
// SELECT * FROM `country` WHERE `id` IN (...)
// SELECT * FROM `order` WHERE `customer_id` IN (...) AND `status` = 1
$customers = Customer::find()->with([
    'country',
    'orders' => function ($query) {
        $query->andWhere(['status' => Order::STATUS_ACTIVE]);
    },
])->all();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы