gpt4 book ai didi

php - YII2.0查询多数据库

转载 作者:搜寻专家 更新时间:2023-10-30 20:52:58 33 4
gpt4 key购买 nike

我的应用程序中有两个数据库,两个数据库的所有表都是相同的(除了用户表,第一个数据库只有一个用户表)通过我登录的第一个数据库。

例如:database1.test 和 database2.test,我在第一个数据库测试表的帮助下创建了测试模型。

根据用户类型登录后,我已经连接了数据库。

用户模型中的代码:

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

}
}

所以现在我与数据库 2 建立连接,并使用测试模型编写查询

我的查询:

$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',
];
}
}

我可以知道如何为我的问题找到解决方案吗。

最佳答案

在您的代码示例中,您的 Test::getDb() 始终获取第一个数据库,它不考虑 $user_type 因此不使用选定的数据库。您的 User::selectDb() 函数返回您要使用的数据库,但它不会改变任何全局状态,这将使它成为默认值(而且它不应该)。

要解决您的问题,Test::getDb() 方法必须能够找到 User::selectDb() 选择的数据库。

如果您正在使用实现 IdentityInterface ( docs ) 的自定义用户帐户类,正如我怀疑的那样,那么您可以在 中添加一个方法用户类;

/**
* @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();
}

您可能希望扩展最后一段代码以确保它在 $usernull 时也能正常工作(例如 return $user ? $user->getSelectedDb() : Yii::$app->get('db1')).如果用户未登录,就会发生这种情况。

关于php - YII2.0查询多数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35338024/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com