2015-11-20 52 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 未定義的索引:服務器 –