YII2.0查询多个数据库

时间:2016-02-11 11:24:33

标签: php mysql database yii2

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

例如: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',
        ];
    }
}

我可以知道如何解决我的问题。

1 个答案:

答案 0 :(得分:0)

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

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

如果您正在使用实现IdentityInterfacedocs)的自定义用户帐户类,我怀疑您是,那么您可以在{{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),您可能希望对最后一段代码进行扩展,以确保它也有效。如果用户未登录,则会发生这种情况。