3

我想在运行时用 Yii 连接到第二个数据库。数据库名称将来自用户登录后的数据库表。

我在教程中看到我应该这样做:

$db2 = Yii::createComponent(array(
    'class' => 'EMongoClient',
    'server' => 'mongodb://127.0.0.1:27017',
    'db' => $emp['database']
));

Yii::app()->setComponent('db2',$db2);

但是在我的控制器中,当我访问时Yii::app()->db2出现错误:

未定义属性“CWebApplication.db2”

我究竟做错了什么?

4

3 回答 3

3

以下对我有用:

Yii::app()->mongodb->setActive(false);
Yii::app()->mongodb->setServer('mongodb://localhost:27017');
Yii::app()->mongodb->setDb('db1');
Yii::app()->mongodb->setActive(true);
于 2013-12-04T05:19:48.567 回答
1

更新:尝试,而不是实例,传递配置:

Yii::app()->setComponent( 'db2', array(
                                      'class' => 'EMongoClient',
                                      'server' => 'mongodb://127.0.0.1:27017',
                                      'db' => $emp['database']
                                  )
);

或者,您可以params在配置中创建特殊索引,例如:

  ...
  'params' => array(
         'db2' => null,
     ),

以及使用Yii::app()->params['db2'] = $db2

于 2013-10-17T13:54:54.257 回答
0

从这个评论:

我的问题不在于组件的创建。创建后不久,如果我访问 Yii::app()->db2 它的工作原理,但是当我尝试通过另一个模型或控制器访问时,我得到了错误

我认为您只在某处设置此组件一次,然后向不同的控制器发出后续请求。

您需要将代码放在每次调用它的地方,放在每个请求上。这就是 PHP 的工作原理,没有“全局应用程序状态”

默认情况下,Yiiprotected/components/controller.php为应用程序的其余部分提供了基本控制器。

我的建议是将您的代码放在该init()控制器的方法上,以便始终调用它。

您提到数据库名称来自用户登录后的表,因此您需要将该值保存在会话中,以便能够在其他请求中访问它:

<?php

// After login in
Yii::app()->user->setState('db_name', $db_name);

// in protected/components/controller.php
public function init()
{
    if (!Yii::app()->user->isGuest) {
        $db2 = Yii::createComponent(array(
            'class' => 'EMongoClient',
            'server' => 'mongodb://127.0.0.1:27017',
            'db' => Yii::app()->user->getState('db_name')
        ));

        Yii::app()->setComponent('db2',$db2);
    }
}

希望它有所帮助,我在这里假设很多事情:)

于 2013-10-18T02:09:51.047 回答