我使用http://www.yiiframework.com/wiki/544/multiple-database-connection-select-database-based-on-login-user-id-dynamic/上的教程进行多个数据库连接。代码在模型中工作正常。但问题是我正在使用扩展,我正在使用数据连接使用Yii :: app() - > db;这里我得到异常属性“CWebApplication.dbadvert”没有定义。扩展的控制器从CExtController扩展。请帮忙。
答案 0 :(得分:0)
在您引用的示例dbadvert
中,为自定义活动记录类RActiveRecord
设置,而不是为Web应用程序设置。
如果您想像Yii::app()->dbadvert
一样使用它,则需要在components
的{{1}}部分进行设置
config.php
<强> UPD 强>
您可以为CDbConnection创建一个包装器组件,它将以您想要的任何方式更改连接字符串并将其作为webapp组件放入。
'dbadvert' => array(
'class' => 'CDbConnection'
*params here*
),
这是组件的粗略示例,您可以将其设置为“db”组件,然后您将获得用于以这种方式存储每用户配置的“连接”选项:
<?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;
}
}
答案 1 :(得分:0)
我在模型中将扩展的查询编写为函数。并在CExtController中创建了一个模型实例。然后我调用了这些函数,一切正常。