我需要在yii2项目中更改模型类。由于数据库发生了变化,因此需要根据模型类的所有查询进行转换 到新的数据库表。但是我想要旧的数据库配置,因为如果我的新数据库出现问题,那么我可以很容易地转移到所有数据库 模型类查询(故障转移)。所以我想要一个旧的模型类,并使用基于常量的新模型类函数覆盖它。如果我已经设定,那就不变 old(0)然后选择旧的db类查询或new(1)然后用新查询覆盖模型。请问如何使用OOPS概念实现这一点 帮助。
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')
{
//
}
}
在Controller类中,我在名称空间中使用父模型类,如:
use api\modules\v1\models\ModelClass;
用于调用模型的功能:
$objModel = new ModelClass(); // call parent class
$objModel->getData();
在params中定义常量:
'model' => '1', // 1 means new or 0 means old
然后如何在模型之间切换而不在控制器的任何地方放置if else条件。需要基本检查0/1才能在模型类之间切换。
答案 0 :(得分:0)
我不完全明白你的意思。那是吗?
$config = array('model' => 1);
$model = $config['model'] == 1
? new api\modules\v1\models\ModelClass()
: new api\modules\v1\models\NewModelClass();
答案 1 :(得分: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
编辑:
刚想到你可以使用魔法__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();
}
}
}
然后在非静态方法中你应该能够只收到$ this等...
如果有人知道更好的解决方案,请随时纠正我!