使用多个数据库连接不适用于扩展

时间:2014-04-22 08:42:30

标签: yii-extensions yii yii-components

我使用http://www.yiiframework.com/wiki/544/multiple-database-connection-select-database-based-on-login-user-id-dynamic/上的教程进行多个数据库连接。代码在模型中工作正常。但问题是我正在使用扩展,我正在使用数据连接使用Yii :: app() - > db;这里我得到异常属性“CWebApplication.dbadvert”没有定义。扩展的控制器从CExtController扩展。请帮忙。

2 个答案:

答案 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中创建了一个模型实例。然后我调用了这些函数,一切正常。