@dsn_qwerty

Обьединение результата запроса с 2 БД?

Привет народ кто подскажет как можно объединить запрос с двух разных БД в один перед скармливанием его ActiveDataProvider.
Суть такова есть 2 одинаковые модели 2 разных БД? надо объединить данные с двух разных БД
class HomeStoreAddresses extends BaseActiveRecord
{
    public static function getDb()
    {
        return Yii::$app->home_db;
    }
}

class ClimaStoreAddresses extends BaseActiveRecord
{
    public static function getDb()
    {
        return Yii::$app->clima_db;
    }
}

Про такой вариант знаю - но работает не так как надо - запрос идет к одной БД
$query1 = HomeStoreAddresses::find()->where([
            'type'      => $type,
            'region_id' => $this->region_id,
        ]);

        $query2 = ClimaStoreAddresses::find()->where([
            'type'      => $type,
            'region_id' => $this->region_id,
        ]);

        $query1->union($query2);
        
        $dataProvider = new ActiveDataProvider([
            'query' => $query1,
            'pagination' => [
                'pageSize' => 10,
            ],
        ]);

Такой вариант не красив и неправилен
$query1 = HomeStoreAddresses::find()->where([
            'type'      => $type,
            'region_id' => $this->region_id,
        ])->all();

        $query2 = ClimaStoreAddresses::find()->where([
            'type'      => $type,
            'region_id' => $this->region_id,
        ])->all();

        $result  = array_merge($query1, $query2);

        $dataProvider = new ArrayDataProvider([
            'key'       =>'id',
            'allModels' => $result,
            'pagination' => [
                'pageSize' => 10,
            ],
        ]);
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 1
qonand
@qonand
Software Engineer
в Вашем случае есть два варианта:
1. Попробовать настроить на уровне базы данных возможность работы с двумя бд. Но это все очень зависит от бд, например в postgre можно настроить dblink и используя его решить Вашу задачу (а в некоторых СУБД такой возможности вообще нет)
2. Отказаться от использования ActiveDataProvider (ну или как-то его переработать самостоятельно) и использовать ArrayDataProvider, т.е. на уровне php выбирать все необходимые данные двумя запросами, и склеивать их средствами php
Ответ написан
Ваш ответ на вопрос

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

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