>我需要通过路由来更改数据库连接(前缀(,当用户路由到系统时 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:使用两个单独的数据库,您不需要不同的前缀。