2017-01-09 13 views
0

Мне нужно изменить класс модели в моем проекте yii2. Из-за изменения базы данных, все запросы класса модели должны быть преобразованы в соответствии с в новую таблицу базы данных. Но я хочу старую конфигурацию db также потому, что если что-то пошло не так в моем новом db, то я могу легко переместиться ко всему запрос класса модели (переход на другой ресурс). Поэтому я хочу старый класс модели и переопределить его с помощью новой функции класса модели, основанной на константе. В константе, если я установлен старый (0), затем выберите старый запрос класса db или новый (1), а затем переопределите модель с новым запросом. Как это возможно с использованием концепции OOPS, пожалуйста, help.Yii переопределение модели на основе константы

class ModelClass extends ActiveRecord 
{ 
    public static function tableName() 
    { 
     return 'table1'; 
    } 
    public function getData($limit = '5', $offset = '0') 
    { 
    // 
    } 
} 

Модель новой модели.

class NewModelClass extends ModelClass 
{ 
    public static function tableName() 
    { 
     return 'table2'; 
    } 
    public static function getDb() 
    { 
     return \Yii::$app->get('newDb'); // second database 
    } 
    public function getData($limit = '5', $offset = '0') 
    { 
    // 
    } 
} 

В классе контроллера я использую родительский класс модели в пространстве имен, как:

use api\modules\v1\models\ModelClass; 

Для вызова функции модели в действии:

$objModel = new ModelClass(); // call parent class 
$objModel->getData(); 

Определение константы в Params:

'model' => '1', // 1 means new or 0 means old 

Затем, как переключаться между моделью, не устанавливая, если еще условия в везде контроллера. Нужно выполнить базовую проверку 0/1 для переключения между классами модели.

+0

Если вы не хотите реализовывать его в контроллере, вы можете сделать это в модели –

ответ

0

Я не понимаю, что вы имеете в виду. в том, что?

$config = array('model' => 1); 

$model = $config['model'] == 1 
    ? new api\modules\v1\models\ModelClass() 
    : new api\modules\v1\models\NewModelClass(); 
+0

. Я не хочу добавлять, если еще где-нибудь в контроллере. Любое другое решение. – truesource

0

Если кто-нибудь знает лучшее решение, не стесняйтесь меня исправить!

Я думаю, что вы можете сделать это непосредственно в методах новой модели,

так:

class NewModelClass extends ModelClass 
{ 
    const $useNew = true; 

    public static function tableName() 
    { 
     if ($useNew) return parent::tableName(); 
     return 'table2'; 
    } 
    public static function getDb() 
    { 
     if ($useNew) return parent::getDb(); 
     return \Yii::$app->get('newDb'); // second database 
    } 
    public function getData($limit = '5', $offset = '0') 
    { 
     // Although there is problem with non-static methods 
     // as you need instance of parent class, in php 
     // you can get away with warning if you use following, 
     // but just in case, you dont use an instance of parent 
     // class or $this word in parent class method 
     if ($useNew) return parent::getData(limit , $offset); 
    // 
    } 
} 

Discussion about using call to parent within non-static method

EDIT:

просто пришел на мой взгляд, вы можете использовать метод магии __construct возможно для нестатических методов, подобных этому, не уверен, что он будет работать

class NewModelClass extends ModelClass 
{ 
    const $useNew = true; 

    public function __construct() { 
     if ($useNew) parent::__construct(); 
    } 
} 

, если это не работает, то возможно

class NewModelClass extends ModelClass 
{ 
    const $useNew = true; 

    public function NewModelClass() { 
     if ($useNew) { 
      $this = new parent::__construct(); 
      // or $this = new ModelClass(); 
     } 
    } 
} 

затем в не статические методы, вы должны быть в состоянии только Reffer до $ это и т.д ...

Если кто-нибудь знает лучше чувствовать себя решение бесплатно исправить меня!

+0

полезно. благодаря – truesource

 Смежные вопросы

  • Нет связанных вопросов^_^