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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
dsn
Сообщения: 63
Зарегистрирован: 2011.05.11, 11:28
Контактная информация:

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

Сообщение dsn »

Привет народ кто подскажет как можно объединить запрос с двух разных БД в один перед скармливанием его 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,
            ],
        ]);
Последний раз редактировалось dsn 2017.03.13, 17:27, всего редактировалось 1 раз.
Кулинарные рецепты с фото на food-list.ru

rak
Сообщения: 2038
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

сделать mysql view и к нему модель

Аватара пользователя
dsn
Сообщения: 63
Зарегистрирован: 2011.05.11, 11:28
Контактная информация:

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

Сообщение dsn »

rak писал(а):
2017.03.13, 17:07
сделать mysql view и к нему модель
не совсем понятно, можно пример в студию
Кулинарные рецепты с фото на food-list.ru

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

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

Сообщение Onotole »

rak писал(а):
2017.03.13, 17:07
сделать mysql view и к нему модель
Разные же базы

rak
Сообщения: 2038
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

Onotole писал(а):
2017.03.13, 17:21
rak писал(а):
2017.03.13, 17:07
сделать mysql view и к нему модель
Разные же базы

да по идее на одном сервере можно, хотя и union вроде как должен работать

Аватара пользователя
dsn
Сообщения: 63
Зарегистрирован: 2011.05.11, 11:28
Контактная информация:

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

Сообщение dsn »

вроде как - но выбирает из одной бд если так написать $query1->union($query2); будет дергаться бд $query1 если наоброт $query2->union($query1); - $query2
Кулинарные рецепты с фото на food-list.ru

rak
Сообщения: 2038
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

а запрос какой генерируется?

Аватара пользователя
dsn
Сообщения: 63
Зарегистрирован: 2011.05.11, 11:28
Контактная информация:

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

Сообщение dsn »

rak писал(а):
2017.03.13, 18:13
а запрос какой генерируется?
Открывает соединение с текущей БД
выборка данных -----
далее

Код: Выделить всё

    (SELECT * FROM `fp_store_addresses`) UNION ( SELECT * FROM `fp_store_addresses` )
Opening DB connection: mysql:host=localhost;port=3306;dbname=forteprom-new
и все соединение идет только с одной из 2 БД
если наоборот соединить будет выборка но только с др БД

Код: Выделить всё

$query2->union($query1);

Код: Выделить всё

    (SELECT * FROM `fp_store_addresses`) UNION ( SELECT * FROM `fp_store_addresses` )
Opening DB connection: mysql:host=localhost;port=3306;dbname=forteprom-clima
Кулинарные рецепты с фото на food-list.ru

rak
Сообщения: 2038
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

это из лога?
ну логично ж, что не работает, имена баз не устанавливаются, а вот почему - это вопрос

rak
Сообщения: 2038
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

можно попробовать вручную добавить имя бд(через alias или через tableName)

Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

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

Сообщение rugabarbo »

rak писал(а):
2017.03.13, 18:42
это из лога?
ну логично ж, что не работает, имена баз не устанавливаются, а вот почему - это вопрос
Думаю, что не реализована в Yii подстановка имён баз в таких кейсах...

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

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

Сообщение Onotole »

rak писал(а):
2017.03.13, 17:43
Onotole писал(а):
2017.03.13, 17:21
rak писал(а):
2017.03.13, 17:07
сделать mysql view и к нему модель
Разные же базы

да по идее на одном сервере можно, хотя и union вроде как должен работать
Если на одном сервере и под одним пользователем то да

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

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

Сообщение Onotole »

rugabarbo писал(а):
2017.03.13, 19:15
rak писал(а):
2017.03.13, 18:42
это из лога?
ну логично ж, что не работает, имена баз не устанавливаются, а вот почему - это вопрос
Думаю, что не реализована в Yii подстановка имён баз в таких кейсах...
Если на одном сервере и под одним пользователем, то в tableName указать явно базу А если на разных, то вариант мерджить результаты уже

Ответить