php - YII2.0查询多数据库

标签 php mysql database yii2

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

例如: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/

相关文章:

php - 在 sphinx 中添加 where 条件以及如何删除 sphinx 中的 setlimit

php - Amazon S3 - 405 方法不允许使用 POST(尽管我允许在存储桶上使用 POST)

php - 亚马逊 MWS : Errors with new 2013 ListOrders API

php - 检查MYSQL中是否存在行

mysql - 初级SQL数据库查询

php - 为什么记录没有出现在数据库中

android - 将 SQLite 与外部 SQL 数据库服务器同步

php - Magento 订单表 : custom column

mysql - sql如何快速查询一个大的自连接表

mysql - 如何在按周分组的mysql查询中以数组形式返回每周数据?