2015-11-20 63 views
2

如何在活动记录中设置数据库配置?如何设置YII2多个DB可配置?

这个文件: app \ models \ multi_db \ Devices;

<?php 
namespace app\models\multi_db; 

use yii\db\ActiveRecord; 

class Devices extends ActiveRecord 
{ 
    private static $dbConn; 

    public function __construct($config=[]) 
    { 
     switch ($config['server']) { 
     case '2': 
      self::$dbConn = \Yii::$app->dbtwo; 
      break; 
     case '3': 
      self::$dbConn = \Yii::$app->dbthree; 
      break;   
     default: 
      self::$dbConn = \Yii::$app->dbone; 
      break; 
     } 
    } 

    public static function getDb() 
    { 
     return self::$dbConn; 
    } 

    public function findDevice($id) 
    { 
     return self::findOne($id); 
    } 
} 

这是我的代码来获取设备:

$model = new Devices(['server' => 3]); 
$device = $model->findDevice(1); 

但这产生错误:

Undefined index: server

我想构造中findDevice方法没有设置?

我该如何解决这个问题?

+0

你试过'var_dump'-ING'$ config',并注释掉开关代码?也许你正在代码中的其他地方创建另一个实例?顺便说一句,你可能还需要在某个时候调用父构造函数。 –

+0

我不明白,你能给我一个例子来倾销$配置吗? 如果我注释掉了switch-case,静态getDb()没有设置,并为Yii2中的模式生成错误。 谢谢。 –

+0

'var_dump($ config);'然后你可以做一些类似'switch(1)'的操作来避免未设置的问题,而不会触发错误。 –

回答

1

好,findOne()会使用你的构造不提供服务器的配置,这就是为什么你得到这个错误,你可以简单地尝试:

public function __construct($config=[]) 
{ 
    if (isset($config['server'])) switch ($config['server']) { 
     case '2': 
      self::$dbConn = \Yii::$app->dbtwo; 
      break; 
     case '3': 
      self::$dbConn = \Yii::$app->dbthree; 
      break;   
     default: 
      self::$dbConn = \Yii::$app->dbone; 
      break; 
    } 
    // don't forget to call parent constructor 
    parent::__construct($config); 
} 

但我觉得这里的逻辑是错误的,这应该使用静态方法进行设置,如:

class Devices extends ActiveRecord 
{ 

    private static $dbConn; 

    public static function setServer($id) 
    { 
     switch ($id) { 
      case '2': 
       self::$dbConn = \Yii::$app->dbtwo; 
       break; 
      case '3': 
       self::$dbConn = \Yii::$app->dbthree; 
       break;   
      default: 
       self::$dbConn = \Yii::$app->dbone; 
       break; 
     } 
    } 

    public static function getDb() 
    { 
     if (self::$dbConn===null) 
      self::$dbConn = \Yii::$app->dbone; 

     return self::$dbConn; 
    } 

} 

然后:

// find device on dbone 
$device = Devices::findOne(1); 

// find device on dbtwo 
Devices::setServer(2); 
$device = Devices::findOne(1); 
+0

太好了,谢谢。现在我明白它是如何工作的。 –

1

看来你有一些错误,

如果使用findOne(id)意味着你正在检索从DB值。 当你应该创建你server这样

$model = new Device(); 
$model->server = 3; 
$model->save(); 

你有一个错误也开关(选择始终是相同的分贝..dbtwo)一想你应该分配不同的db(dbOne,dbTwo,dbthree)

class Devices extends ActiveRecord 
{ 
private static $dbConn; 

public function __construct($config=[]) 
{ 
    switch ($config['server']) { 
    case '2': 
     self::$dbConn = \Yii::$app->dbtwo; 
     break; 
    case '3': 
     self::$dbConn = \Yii::$app->dbthree; 
     break;   
    default: 
     self::$dbConn = \Yii::$app->dbone; 
     break; 
    } 
} 

public static function getDb() 
{ 
    return self::$dbConn; 
} 

public function findDevice($id) 
{ 
    return self::findOne($id); 
} 
} 
+0

好吧,这是我在switc语句中对同一个db的错误。 我试过你的代码,但仍然得到错误。 我很困惑如何使用db语句,findOne等创建'服务器'配置。 谢谢 –

+0

现在出现什么错误? – scaisEdge

+0

仍然是相同的错误, PHP通知 - yii \ base \ ErrorException 未定义的索引:服务器 –