如何在活动记录中设置数据库可配置?
这是我的档案: 应用\模型\ 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
方法中设置?
我该如何解决这个问题?
答案 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);