ActiveRecord запрос на выборку из БД отличной от текущей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

ActiveRecord запрос на выборку из БД отличной от текущей

Сообщение chungachguk »

Господа!

Есть обычный класс ActiveRecord, пусть будет SomeModel.
Есть подключение к локальной базе данных, описанном в Yii::$app->db.
Есть подключение к удалённой базе данных, описанной в Yii::$app->remoteDb.

Делаю следующую выборку одной записи:

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

SomeModel::find()->where(['id' => 1])->one(Yii::$app->remoteDb);
Получаю ошибку:

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

Exception 'yii\base\InvalidConfigException' with message 'The table does not exist: {{%some_table}}'
Насколько я понял из исходников, в модели нужно реализовать метод с нужным подключением, т.е.:

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

class SomeModel extends ActiveRecord {

    public static function getDb()
    {
        return Yii::$app->get('remoteDb');
    }

}
Связано это с получением схемы таблицы для данной модели, и которой в локальной базе данных нет (если при выборке добавить asArray(), то всё работает как надо).

Вопрос в следующем, для чего в методах one/all имеется возможность задавать другое подключение к БД, но схема берётся из той что описана в модели? Есть ли возможность задавать подключение только в одном месте, либо в методах one/all, либо через контейнер?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: ActiveRecord запрос на выборку из БД отличной от текущей

Сообщение Nex-Otaku »

Есть ли возможность задавать подключение только в одном месте
Это и есть одно место. Один раз для одной модели.

Вы ведь одни модели из одной БД берёте, другие из другой, так? Поэтому для каждой группы моделей надо указать, какую БД они будут использовать. Иначе никак.

Если просто хочется избавиться от дублирования по максимуму, ну, можно суперкласс сделать, и наследовать модели от него. БД задать в методе суперкласса.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: ActiveRecord запрос на выборку из БД отличной от текущей

Сообщение chungachguk »

Nex-Otaku писал(а): 2017.11.27, 20:46
Есть ли возможность задавать подключение только в одном месте
Это и есть одно место. Один раз для одной модели.
Если просто хочется избавиться от дублирования по максимуму, ну, можно суперкласс сделать, и наследовать модели от него. БД задать в методе суперкласса.
Вот от этого места и хотелось бы избавиться, чтобы не выдумывать всяких суперклассов, в частности писать логику в статике.
Ответить