Одна модель на две базы данных

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Одна модель на две базы данных

Сообщение spions » 2018.07.31, 13:50

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

Пробую передать название базы через "__construct", но возникает ошибка в " Error: Using $this when not in object context in" в строке "return Yii::$app->get($DbConnectName);"

Буду рад предложениям по решению данной проблемы.

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

    private $DbConnectName;

    public  function __construct($DbConnectName = 'local', $config = [])
    {
        $this->DbConnectName = $DbConnectName;
        parent::__construct($config);
   }  

    /**
     * @return \yii\db\Connection the database connection used by this AR class.
     */
    public static function getDb()
    {

        $DbConnectName = $this->DbConnectName;
        return Yii::$app->get($DbConnectName);
    }

someweb
Сообщения: 540
Зарегистрирован: 2017.03.09, 10:12

Re: Одна модель на две базы данных

Сообщение someweb » 2018.07.31, 15:27

В static методе так нельзя, он выполняется не в контексте объекта. Поле тоже должно быть static и обращаться через static::DbConnectName.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Одна модель на две базы данных

Сообщение yan » 2018.07.31, 15:44

дублировать не надо потому что ООП - отнаследуйтесь и перекройте метод getDb, и красивее и пользоваться проще

Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Re: Одна модель на две базы данных

Сообщение spions » 2018.07.31, 16:30

yan писал(а):
2018.07.31, 15:44
дублировать не надо потому что ООП - отнаследуйтесь и перекройте метод getDb, и красивее и пользоваться проще
Правильно я понимаю, что тогда мне все равно для каждой таблицы новой базы придется делать модель?

Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Re: Одна модель на две базы данных

Сообщение spions » 2018.07.31, 16:38

someweb писал(а):
2018.07.31, 15:27
В static методе так нельзя, он выполняется не в контексте объекта. Поле тоже должно быть static и обращаться через static::DbConnectName.
Можно пример кода? Попробовал "в лоб", все равно ошибки.

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Одна модель на две базы данных

Сообщение andku83 » 2018.07.31, 16:47

добавьте в конфиг еще одну БД и используйте через:

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

Model::find()->one('db2');
Model::find()->all('db2');

Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Re: Одна модель на две базы данных

Сообщение spions » 2018.07.31, 16:51

andku83 писал(а):
2018.07.31, 16:47
добавьте в конфиг еще одну БД и используйте через:

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

Model::find()->one('db2');
Model::find()->all('db2');
А если нет "->one" и ">all" ?

yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Одна модель на две базы данных

Сообщение yan » 2018.07.31, 17:28

spions писал(а):
2018.07.31, 16:30
yan писал(а):
2018.07.31, 15:44
дублировать не надо потому что ООП - отнаследуйтесь и перекройте метод getDb, и красивее и пользоваться проще
Правильно я понимаю, что тогда мне все равно для каждой таблицы новой базы придется делать модель?
конечно, но дублирования кода при этом не будет, так что ничего страшного, особенно если этим нужно часто пользоваться

andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Одна модель на две базы данных

Сообщение andku83 » 2018.07.31, 22:48

spions писал(а):
2018.07.31, 16:51
А если нет "->one" и ">all" ?
Mожет тогда стоило сказать в какой ситуации оно вам нужно и там нет one и all ?

Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Re: Одна модель на две базы данных

Сообщение spions » 2018.08.02, 21:16

Попробовал отнасделовать модель, получил ошибку: "Error: Call to a member function getSchema() on null in"

Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Re: Одна модель на две базы данных

Сообщение spions » 2018.08.02, 21:16

andku83 писал(а):
2018.07.31, 22:48
spions писал(а):
2018.07.31, 16:51
А если нет "->one" и ">all" ?
Mожет тогда стоило сказать в какой ситуации оно вам нужно и там нет one и all ?
Например, в ситуации запись и обновление.

yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Одна модель на две базы данных

Сообщение yan » 2018.08.02, 21:24

spions писал(а):
2018.08.02, 21:16
Попробовал отнасделовать модель, получил ошибку: "Error: Call to a member function getSchema() on null in"
это не в наследовании проблема, а что-то не то сделано с методом "public static function getDb()" и в результате идет обращение к несуществующему коннекту

Аватара пользователя
spions
Сообщения: 21
Зарегистрирован: 2015.05.27, 10:45
Контактная информация:

Re: Одна модель на две базы данных

Сообщение spions » 2018.08.02, 21:55

Да, сам накосячил в экшене. С наследованием все впорядке. Спасибо!

Ответить