Yii連線多個資料庫的方法

jefferyjob發表於2016-03-29

Yii連線多個資料庫的方法

 

 

一、配置多資料庫

大多數情況下,我們都會採用同一型別的資料庫,只是為了緩解壓力分成主從或分散式形式而已。宣告你可以在主配置檔案main.php中裡宣告其它的資料庫連線:

<?php
    `components`=>array(
        `db`=>….// 
主連結
        `db1`=>…// 
從連線1
        `db2`=>…// 
從連線2
    )

操作在程式碼裡,可以通過Yii::app()->db1Yii::app()->db2獲得兩個從連線。

`db1`=>array(
            `class`           =>`CDbConnection`
,
            `connectionString`=>
`mysql:host=localhost;dbname=test;charset=…`,
            `emulatePrepare`=>
true,
            `username`=>
`test`,
            `password`=>
`test`,
            `charset`=>
`utf8`,
        ),

 

 第二個以後的db1陣列中一定要寫上class引數,讓Yii
知道你在定義一個資料庫連線物件,不然會報錯。
一旦我們這樣定義以後,就可以通過Yii::app()->db1來指向第二個資料庫了。

二、過載GetDbConnection() 方法
因為每個Model都是(直接或者間接地)繼承自基類CActiveRecord的,因此,都包含GetDbConnection()這個方法,GetDbConnection()返回一個資料庫連線物件的控制程式碼。我們需要在模型(model)裡面通過過載這個方法來返回我們需要的資料庫物件。

然後,假設我們新建了一檔案 : protected/components/Sub1ActiveRecord.php ,然後在你的所有要用db1這個資料庫的model裡extendSub1ActiveRecord 而不是 CActiveRecord 。
這裡我們是通過擴充套件Yii通用類來定義一個新的類,而不是在每個模型裡面都過載 getDbConnection 方法,這樣做的好處是更大程度上的程式碼重用,節省時間。

過載程式碼如下:

 

// protected/components/MyActiveRecord.php
 
class
Sub1ActiveRecord extends CActiveRecord{

    public function getDbConnection()
    {
        if(self::$db!==null)
            returnself::$db;
        else
        {
                       //這裡就是我們要修改的
            self::$db=Yii::app()->getComponent(`db1`);
                       //self::$db=Yii::app()->db1;
            if(self::$db instanceofCDbConnection)
                return self::$db;
            else
                throw new CDbException(Yii::t(`yii`,`Active
Record requires a “db1” CDbConnectionapplication component.`
));
        }
    }
………..
}

三,在模型中使用
經過以上兩步以後,我們就可以這樣來用:

1
2
3
4
5

// protected/models/Ad.php
 
class Ad extends Sub1ActiveRecord
{

   
}

 


相關文章