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

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

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

Пробую передать название базы через "__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);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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