具有不同数据库的Yii2模块
我想合并两个应用程序。其中一个作为模块。有两个不同的数据库。模块使用另一个数据库作为基本应用程序 我已经创建了db连接,它是config.php中的一个组件具有不同数据库的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
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
}
}