Страница 1 из 1

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

Добавлено: 2017.11.27, 12:54
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, либо через контейнер?

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

Добавлено: 2017.11.27, 20:46
Nex-Otaku
Есть ли возможность задавать подключение только в одном месте
Это и есть одно место. Один раз для одной модели.

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

Если просто хочется избавиться от дублирования по максимуму, ну, можно суперкласс сделать, и наследовать модели от него. БД задать в методе суперкласса.

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

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