YII2.通过路由更改数据库连接



>我需要通过路由来更改数据库连接(前缀(,当用户路由到系统时 site.com/db1/post 使用 db1 组件配置,以及路由到系统时 site.com/db2/post 使用 db2

'components' => [
'db1' => [
     ...,
    'tablePrefix' => 'base1_',
],
 'db2' => [
     ...,
     'tablePrefix' => 'base2_',
],
...

可能吗?也许有更好的解决方案来更改数据库前缀。我需要使用一个具有不同表的模型(仅前缀更改(

有几个选项。 可能最简单的方法是使用 url 规则;见 http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html#url-rules

rules => [
    '<db:dbd>/post' => 'site/post',
]

这会将 db1/post 重定向到站点/帖子,并将"db"参数设置为"db1"。 然后在您的站点控制器中:

public function actionPost($db) {
    YourModel::setDb(Yii::$app->$db);
    $model = new YourModel();
    // do what you need with your model
    // and return the rendered result
}

在你的模型类中,你需要重写getDb((静态方法,并编写一个setDb方法:

private static $_db;
public static function getDb() {
    if (isset(self::$_db)) {
        return self::$_db;
    }
    return ActiveRecord::getDb();
}
public static function setDb($db) {
    self::$_db = $db;
}

一个简单的解决方案类似于高级模板..,其中您有两个具有不同配置部分的不同应用程序.. in

/db1/config/main.php  
您可以将设置为访问您喜欢的

表前缀(或您喜欢的数据库(的数据库组件放置

'components' => [
  'db' => [
 ...,
     'tablePrefix' => 'base1_',
  ],

和在

  /db2/config/main.php  
'components' => [
  'db' => [
 ...,
     'tablePrefix' => 'base2_',
  ],

您可以将通用命名空间用于您需要的所有常见应用程序,例如模型,控制器,视图等。
以及特定元素的每个重新命名的命名空间。

显然,这只是一个建议..可能还有其他简单而智能的解决方案

PS:使用两个单独的数据库,您不需要不同的前缀。

最新更新