如何设置YII2多个DB可配置?

时间:2015-11-20 07:05:30

标签: php yii2 yii2-basic-app

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

这是我的档案: 应用\模型\ multi_db \设备;

<?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);

但这会产生错误:

  

未定义索引:服务器

我认为构造函数没有在findDevice方法中设置?

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

好像你有一些错误,

如果您使用findOne(id)意味着您要从数据库中检索值。 当你以这种方式创建server

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

你在交换机中也有错误(你总是选择相同的db ..dbtwo)a认为你应该分配不同的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);
 }
}

答案 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);