2014-04-22 48 views
0

我正在使用教程http://www.yiiframework.com/wiki/544/multiple-database-connection-select-database-based-on-login-user-id-dynamic/做多個數據庫連接。代碼在模型中正常工作。但問題是我正在使用擴展,我使用數據庫連接使用Yii ::應用程序() - >數據庫;這裏我得到異常屬性「CWebApplication.dbadvert」未定義。該擴展的控制器從CExtController擴展。請幫忙。使用多個數據庫連接不能用於擴展

回答

0

我寫了模型中擴展的查詢作爲函數。並在CExtController中創建了該模型的一個實例。然後我打電話給這些功能,一切正常。

0

在您指定的示例中,dbadvert設置爲自定義活動記錄類RActiveRecord,不適用於Web應用程序。

如果你想使用它像Yii::app()->dbadvert,你需要把它架在你的config.phpcomponents節這樣

'dbadvert' => array(
    'class' => 'CDbConnection' 
    *params here* 
), 

UPD

您可以創建CDbConnection包裝部件,這將改變連接字符串任何你想要的方式,並作爲一個Web應用程序組件。

<?php 

class CMultiuserDatabaseConnection extends CApplicationComponent { 

     public function __call($name, $params) { 
       $db = $this->db; 
       return call_user_func_array(($db, $name), $params); 
     } 

     public $dbConnectionClass = 'CDbConnection'; 
     public $connections = null; 
     public $defaultConfiguration = null; 

     public function getDatabaseConfiguration($user) { 
       if (!$this->connections) { return array(); } 
       return array_key_exists($user, $this->connections) ? $this->connections[$user] : $this->defaultConfiguration; 
     } 

     public function getDb() { 
       $user = Yii::app()->user; 
       if ($user->isGuest) { return false; } 
       $username = $user->name; 
       $config = $this->getDatabaseConfiguration($username); 
       if (!$config) { return false; } 
       $dsn = array_key_exists('dsn', $config) ? $config['dsn'] : null; 
       if (!$dsn) { return false; } 
       $user = array_key_exists('user', $config) ? $config['user'] : null; 
       $password = array_key_exists('password', $config) ? $config['password'] : null; 
       $result = new $this->dbConnectionClass($dsn, $user, $password); 
       return $result; 
     } 
} 

這部分,你可以設置爲你的「分貝」組件的原始的例子,然後你會得到「連接」選項用於存儲這種方式,每個用戶的配置:

'components' => array(
    ... 
    'db' => array(
     'class' => "CMultiuserDatabaseConnection", 
     'connections' => array(
      "first-user-name" => array(
       // just another db configuration here, for user-one 
      ), 
      "second-user-name" => array(
       // just another db configuration herer, for user two 
      ), 
      ... 
     ), 
     'defaultConfiguration' => array(
      /* 
      * here goes configuration for all other user, that were not specified 
      * in connections. 
      */ 
     ), 
    ), 
    ... 
), 
+0

但我想動態地改變連接字符串。如果我把它寫在配置文件中,那麼它是不可能的。 – user1690835

+0

請給我一個例子。 – user1690835

+0

如何根據登錄用戶使用此功能來更改數據庫? – user1690835

相關問題