Php 如何设置YII2多数据库可配置?

Php 如何设置YII2多数据库可配置?,php,yii2,yii2-basic-app,Php,Yii2,Yii2 Basic App,如何在活动记录中设置可配置的数据库 这是我的文件: app\models\multi\u db\Devices 但这会产生错误: 未定义的索引:服务器 我认为构造函数没有在findDevice方法中设置 我该怎么解决这个问题呢?看来你搞错了 如果您使用findOne(id)意味着您可以从数据库中检索值。 当您应该以这种方式创建服务器时 $model = new Device(); $model->server = 3; $model->save(); 您在开关中也有一个错误(您总是

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

这是我的文件: app\models\multi\u db\Devices

但这会产生错误:

未定义的索引:服务器

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


我该怎么解决这个问题呢?

看来你搞错了

如果您使用
findOne(id)
意味着您可以从数据库中检索值。 当您应该以这种方式创建服务器时

$model = new Device();
$model->server = 3;
$model->save();
您在开关中也有一个错误(您总是选择相同的db..dbtwo)a您认为应该分配不同的
db
(dbOne,dbtwo,dbthree)

嗯,
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);

您是否尝试过
var\u dump
-ing
$config
,并注释掉开关盒代码?也许您正在代码的其他地方创建另一个实例?顺便说一句,您可能还需要在某个时候调用父构造函数。我不明白,您能给我一个转储$config的示例吗?因为如果我注释掉了switch case,那么在Yii2中静态getDb()未设置并生成模式错误。谢谢。
var_dump($config)然后您可以执行类似于
开关(1)
的操作,以避免未设置问题,而不会触发错误。您好,感谢您的帮助,soju答案正在工作。好的,这是我对switc语句中相同db的错误。我已经尝试了你的代码,但仍然得到错误。在使用db语句、findOne和其他语句时,我不知道如何创建“服务器”配置。感谢您,直到出现同样的错误,PHP注意–yii\base\ErrorException未定义索引:server,但是您是否创建了类似于suggest?的实例?。你是如何从db那里获得距离的?嗨,谢谢你帮我。soju的答案是为我工作。
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);