具有不同数据库的Yii2模块

具有不同数据库的Yii2模块,yii2,yii2-module,Yii2,Yii2 Module,我想合并两个应用程序。其中一个作为模块。有两个不同的数据库。模块使用另一个数据库作为基本应用程序 我已经创建了db连接,它是config.php中的一个组件 return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=test_db', 'username' => 'root', 'password' => '', 'chars

我想合并两个应用程序。其中一个作为模块。有两个不同的数据库。模块使用另一个数据库作为基本应用程序

我已经创建了db连接,它是config.php中的一个组件

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=test_db',
    'username' => 'root',
    'password' => '',    
    'charset' => 'utf8',
];
我创建了一个ModuleActiveRecord类,它覆盖了活动记录函数getDB():

class ModuleActiveRecord extends ActiveRecord
{
    public static function getDb()
    {
        $db = Yii::$app->controller->module->db;
        return Yii::createComponent($db);
}
我收到错误消息:该表不存在。
任何人有想法吗?

复制db连接文件并在config(web.php)中导入两个连接:

然后覆盖ActiveRecord中的数据库连接,该连接使用复制数据库,如下所示:

public static function getDb()
{
    return Yii::$app->get('db_copy');
}

复制db连接文件并在config(web.php)中导入两个连接:

然后覆盖ActiveRecord中的数据库连接,该连接使用复制数据库,如下所示:

public static function getDb()
{
    return Yii::$app->get('db_copy');
}

您可以像其他答案一样添加多个数据库连接,例如:db/db\u for\u模块

您也可以像我一样配置模块(例如使用Yii2高级模板):

v1模块的定义

// in frontend/modules/Module.php
<?php

namespace frontend\modules\v1;

/**
 * v1 module definition class.
 */
class Module extends \yii\base\Module
{
    /**
     * {@inheritdoc}
     */
    public $controllerNamespace = 'frontend\modules\v1\controllers';
}
//在frontend/modules/Module.php中

您可以像其他答案一样添加多个数据库连接,例如:db/db\u for\u模块

您也可以像我一样配置模块(例如使用Yii2高级模板):

v1模块的定义

// in frontend/modules/Module.php
<?php

namespace frontend\modules\v1;

/**
 * v1 module definition class.
 */
class Module extends \yii\base\Module
{
    /**
     * {@inheritdoc}
     */
    public $controllerNamespace = 'frontend\modules\v1\controllers';
}
//在frontend/modules/Module.php中

您只需添加另一个数据库连接
组件
比如说
db2
,然后在
模块/models
文件夹中创建一个basemodel,并覆盖
getDb()
方法以返回数据库连接,如
return Yii::$app->db2,所有其他模型都应该扩展该模型,我不明白为什么要返回
returnyii::createComponent($db)
您不应该在您的模型中使用
Yii::$app->controller
,它打破了MVC模式。您只需要添加另一个数据库连接
组件
,比如说
db2
,然后在
模块/模型
文件夹中创建一个基本模型,并覆盖
getDb()
方法返回数据库连接,如
return Yii::$app->db2
和所有其他模型都应该扩展该模型,我不明白为什么要返回
return Yii::createComponent($db)
您不应该在您的模型中使用
Yii::$app->controller
,它打破了MVC模式。非常感谢。这正是我所想象的。不幸的是,我犯了一个错误正在尝试获取非对象“”的属性。我已经用db数据扩展了模块配置(在基本应用程序中),并调用了模块类中的db组件(在函数“init”下),对吗?此配置不需要修改任何Yii框架代码,这是最初支持的。你引起了什么变化?给你我的模块类的代码作为参考:class Module extends\yii\base\Module{/***{@inheritdoc}*/public$controllerNamespace='frontend\modules\v1\controllers';}很好,我发现了错误。非常感谢。注释:我已经在模块的配置文件中创建了新的db连接。我重新编辑了这个例子,希望它能给你和其他人一些帮助。非常感谢。这正是我所想象的。不幸的是,我犯了一个错误正在尝试获取非对象“”的属性。我已经用db数据扩展了模块配置(在基本应用程序中),并调用了模块类中的db组件(在函数“init”下),对吗?此配置不需要修改任何Yii框架代码,这是最初支持的。你引起了什么变化?给你我的模块类的代码作为参考:class Module extends\yii\base\Module{/***{@inheritdoc}*/public$controllerNamespace='frontend\modules\v1\controllers';}很好,我发现了错误。非常感谢。注释:我已经在模块的配置文件中创建了新的db连接。我重新编辑了这个例子,希望这能给你和其他人一些帮助。
// in frontend/modules/v1/controllers/TestController.php
<?php

namespace frontend\modules\v1\controllers;

/**
 * Test Controller
 */
class TestController extends \yii\web\Controller {

    public function actionTest()
    {
        \Yii::$app->modules['v1']->db->createCommand(...); // This db points to the db connection of this module configuration
        // or
        $this->module->db->createCommand(...) // This db points to the db connection of this module configuration
    }
}