Yii PHP:用于读/写数据的动态数据库连接

时间:2012-10-08 11:36:29

标签: php yii multiple-databases

我正在开发一个扫描/抓取/监控某些网站的应用

该应用可在www.linkbook.co

免费使用

现在,我将解释我想做的事情:

我有一个主数据库,用于存储网站,网站上的网址和每个网站的网址模式;网站知道他被分配到的Db,网址知道网站ID;

因为我有2 GB / DB限制,所以我需要辅助DB。

我从http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii/读取所有内容以及Google可以找到的内容,并且没有一个完整的示例使用dinamicaly连接;

因此,每当我的应用程序扫描网站时,找到的每个网址都将插入主数据库中,也会插入已分配给该网址所属网站的数据库中。

随着时间的推移,来自主数据库的数据将被删除,但它仍可在辅助数据库中使用。

因此,只有HOT信息存储在主信息中,但它们仍保存在辅助数据库中

Yii的家伙给出了这个例子,但我需要一个参数,从1到N,N = 1->无限,以便切换到正确的数据库。

class MyActiveRecord extends CActiveRecord {
    ...
    private static $dbadvert = null;

    protected static function getAdvertDbConnection()
    {
        if (self::$dbadvert !== null)
            return self::$dbadvert;
        else
        {
            self::$dbadvert = Yii::app()->dbadvert;
            if (self::$dbadvert instanceof CDbConnection)
            {
                self::$dbadvert->setActive(true);
                return self::$dbadvert;
            }
            else
                throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
        }
    }
    ...

$ dbadvert需要是dinamic,这是我的问题。

另外,来自辅助DB的表格并不完全相同,因为我不需要所有表格中的所有字段,而且一些表格也会被删除,所以我需要一个模型;

我可以写它的模型,这并不难,我只会删除一些字段;

这就是我现在所拥有的,只是插入,在特定的数据库中,db1 a.k.a. linkbookco1

$command = Yii::app()->db1->createCommand("INSERT INTO `url` (
`id` ,
`website_id` ,
`link` ,
`name` ,
`created` ,
`instance_scanner_id` ,
`status`
)
VALUES (
NULL ,  '".($model_url->website_id)."',  '".($model_url->link)."',  '".($model_url->name)."',  '".($model_url->created)."',  '".($model_url->instance_scanner_id)."',  '".($model_url->status)."'
);
");
$command->query();

db1和它的params在配置文件中提到,正如yii开发人员所说;

1 个答案:

答案 0 :(得分:1)

从您的示例中我可以猜测您在应用中配置了辅助数据库连接,如

'dbadvert' => array(
    'class' => 'CDbConnection',
    ...
)

您需要获得数据库连接的地方:

self::$dbadvert = Yii::app()->dbadvert;

因此,要拥有多个数据库连接,您需要将它们添加到数据库配置

'dbadvert1' => array(
    'class' => 'CDbConnection',
    ...
)
'dbadvert2' => array(
    'class' => 'CDbConnection',
    ...
)

在您的代码中,您可以执行类似

的操作
self::$dbadvert = Yii::app()->getComponent("dbadvert".Yii::app()->request->getQuery('dbid', ''));