2017-02-11 2 views
0

J'ai besoin de changer la connexion db (préfixe) par routage, Lorsque la route de l'utilisateur vers site.com/db1/post utilise la configuration des composants db1, et quand route vers site.com/db2/post système utilisé db2YII2. Modifier la connexion db par routage

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

Est-ce possible? Peut-être avoir une meilleure solution pour changer le préfixe db. J'ai besoin d'utiliser un modèle avec table différente (uniquement le changement de préfixe)

Répondre

0

Il y a deux options. Probablement le plus simple est d'utiliser des règles d'URL; voir http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html#url-rules

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

Cela va rediriger DB1/post sur le site/après avec le paramètre "db" sur "DB1". Ensuite, dans votre SiteController:

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

Dans votre classe de modèle, vous aurez besoin de passer outre la méthode statique GetDB(), et d'écrire une méthode 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; 
} 
+0

Merci fot réponse! J'ai oublié que j'ai trop de contrôleurs. J'utilise un autre moyen par changement d'Utilisateur et pour chaque Utilisateur faites votre connexion db. –

0

Une solution simple est similaire au modèle avancé .. où vous avez deux applications différentes avec différentes sections de config .. dans

/db1/config/main.php 

vous pouvez placer le composant db setted pour accéder au préfixe de table que vous préférez (ou aussi la base de données que vous préférez)

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

et

/db2/config/main.php 

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

Vous pouvez utiliser l'espace de noms commun pour tous les elemnts d'application communes dont vous avez besoin .. modèles, contrôleurs, vues et ainsi .. sur
et chaque espace de noms Reseved pour des éléments spécifiques ..

obviuosly cette isjust une suggestion .. peut-être il y a d'autres solutions faciles et intelligentes

PS: en utilisant deux bases de données séparées vous n'avez pas besoin préfixe différent ..