yii 多数据库连接

英文原文:http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii

翻译原文: http://dao.daimaku.com/post/201104/148.html#comment-47


以下方案经本人实践,真实好用,推荐

在Yii应用的配置文件 protected/config/main.php 中通常只有一个数据库配置段落,不过要让它支持多个数据库,并且让不同的Model绑定到不同的数据库也很简单的。

我们将在官方blog示例程序上增加一个独立的广告数据库,虽然广告数据库和博客是关联的,但它仍然是一个独立的系统。

建立配置 

首先在配置文件的第一个数据库配置段落之后增加一个新的数据库段落,当然你可以把它叫做db2,但是为了可读性我们把它命名为 dbadvert。


// protected/main/config.php
return  array (
. . .
'components'  = >  array (
'db'   = >  array (
'connectionString'  = >  'mysql:host=dbserver1;dbname=my1db' ,
. . .
) ,
'dbadvert'  = >  array (
'connectionString'  = >  'mysql:host=adserver2;dbname=advertisingDB' ,
'username'  = >  'advertuser' ,
'password'  = >  '***********' ,
. . .
'class'  = >  'CDbConnection'  // DO NOT FORGET THIS!
) ,
. . .

它的参数和默认数据库配置段落的参数基本一致,不同的是必须增加一个class参数,这样Yii才能知道您定义的这个段落是数据库配置,否则配置无法成功。

完成以上设置后,你就可以像使用 Yii::app()->db 一样使用 Yii::app()->dbadvert 来调用你的第二个数据库了。

但是我们可以做的不仅仅是这些,还包括对GII工具和Active Record的支持。

使用Gii

提示:由于我的项目已经在开发中,当然对登录,访问都做了一些控制,所以,换了默认数据库之后根本没法使用gii,


方案一:解决方法,新建一个yii项目,连上我们需要增加的数据库,操作GII,把得到的model ,controller, view拷贝到自己项目中就ok了

方案二 :Gii只能支持使用默认数据库连接快速建立 models/controllers/crud 等代码,所以你需要临时地将protected/config/main.php 文件中的广告数据库修改成默认数据库连接:


// protected/config/main.php
'components' => array(
# 'db' => array(
# 'connectionString' => 'mysql:host=dbserver1;dbname=my1db',
# ...
#  ),
// TEMPORARY (put back to 'dbadvert' when done)
'db' => array(
'connectionString' => 'mysql:host=adserver2;dbname=advertisingDB',

完成以上操作后,你就可以使用Gii工具来创建你需要的代码了,完成后别忘记将数据库配置还原哦!




GetDbConnection() override

所有定义的 protected/models/*.php Model都在其父类中包含一个getDbConnection()的方法,它返回主数据库的连接对象。我们需要在新数据库关联的Model定义中覆写这个方法,让这个方法返回新数据的连接对象。

当然可以在Model定义文件自身中完成覆写,但是当存在多个类似Mode时,每个Model都需要一段覆写代码,这就没有必要了。最好另外定义一个CActiveRecord对象的包装类,在这个包装类中加入getDbConnection()的覆写方法,相关Model定义从这个包装类下继承,这样代码可读性维护性都大大提高了。

自定义包装类得方法在此文章中另有讲解,我们假定已经定义好了 protected/components/MyActiveRecord.php,将新数据的关联Model修改为继承自MyActiveRecord,而不是默认的CActiveRecord。

PHP


//  protected/components/MyActiveRecord.php
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.' ) ) ;
}
}
. . .

注意,这个覆写类是特意设为static的。现在一切准备好了,我们来修改Model自身的定义代码吧:


// protected/models/Ad.php
class  Ad  extends   MyActiveRecord  {
. . .
public   function   getDbConnection ( )
{
return   self :: getAdvertDbConnection ( ) ;
}
. . .

 

现在这个Model就可以正确地连接到广告数据库,而不是默认的blog数据库了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值