我的应用程序中有两个数据库,两个数据库的所有表都是相同的(除了用户表,第一个数据库只有一个用户表),通过我登录的第一个数据库。
例如:database1.test和database2.test,我已经在第一个数据库测试表的帮助下创建了测试模型。
根据user_type登录后,我连接了数据库。
public static function selectDb($user_type) {
switch($user_type) {
case 1:
return Yii::$app->get('db2'); //database2
case 0:
return Yii::$app->get('db1'); //database1
}
}
现在我与database2建立连接,然后使用测试模型
编写查询我的查询:
$model = \app\models\Test::find()->all();
此查询中显示空结果。
我的测试模型
class Test extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'tbl_test';
}
/**
* @return \yii\db\Connection the database connection used by this AR class.
*/
public static function getDb()
{
return Yii::$app->get('db1');
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id'], 'integer'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
];
}
}
我可以知道如何解决我的问题。
答案 0 :(得分:0)
在您的代码示例中,Test::getDb()
始终获取第一个数据库,但它不考虑$user_type
,因此不使用所选数据库。
您的User::selectDb()
函数返回您要使用的数据库,但它不会改变任何使其成为默认值的全局状态(并且它不应该)。
要解决您的问题,Test::getDb()
方法必须能够找到User::selectDb()
选择的数据库。
如果您正在使用实现IdentityInterface
(docs)的自定义用户帐户类,我怀疑您是,那么您可以在{{1}添加类似的方法} class;
User
然后您的/**
* @returns \yii\db\Connection
*/
public function getSelectedDb()
{
return static::selectDb($this->user_type);
}
课程可能如下所示:
Test
如果/**
* @return \yii\db\Connection gets a connection to the database for the current user type.
*/
public static function getDb()
{
/** @var app\models\User */
$user = Yii::$app->user;
return $user->getSelectedDb();
}
为$user
(例如null
),您可能希望对最后一段代码进行扩展,以确保它也有效。如果用户未登录,则会发生这种情况。