这边自定义了一个CActiveRecord的子类

废话不说了 直接上代码

  1. class OciActiveRecord extends CActiveRecord 
  2.     protected $_hasOciKey = true; //是否使用Oracle主键(单一主键=> 序列 | guid)  设置为false时,可用于mysql 分库操作 
  3.     protected $_sequenceName = ''//使用的序列名称 
  4.     protected $_dbName = ''// 使用的数据库配置名称 ,优先级较高 
  5.     protected $_dbUser = ''// 通过用户 选择数据库 (可选择使用数据库用户名,或访问用户id 等) 
  6.          
  7.     public function setSequence($sequenceName) { 
  8.         $this->_sequenceName = $sequenceName
  9.     }  
  10.     public function getSequence() { 
  11.         return $this->_sequenceName; 
  12.     } 
  13.      
  14.     public function setDbName($dbName){ 
  15.         $this->_dbName = $dbName
  16.     }  
  17.     public function getDbName(){ 
  18.         return $this->_dbName; 
  19.     } 
  20.      
  21.     public function setDbUser($dbUser){ 
  22.         $this->_dbUser = $dbUser
  23.     }  
  24.     public function getDbUser(){ 
  25.         return $this->_dbUser; 
  26.     } 
  27.      
  28.     public function getDbConnection() { 
  29.         $t_db = 'db'
  30.         if($this->_dbName != '')  
  31.             $t_db = $this->_dbName; 
  32.         else if($this->_dbUser !='')  
  33.             $t_db = $this->chooseDb($this->_dbUser); 
  34.         parent::$db = Yii::app()->getComponent($t_db); 
  35.         return parent::getDbConnection(); 
  36.     } 
  37.          
  38.     private function chooseDb($temp_user){ //判断数据库用户名 返回对应的数据库配置名称  
  39.         $temp_db = 'db'
  40.         switch($temp_user) { //some examples 
  41.             case 'wj'$temp_db = 'dbtest'break
  42.             //case 'hr': $temp_db = 'test'; break; 
  43.             //case $temp_user >= 100000 && $temp_user <= 199999: $temp_db = 'dbu2'; break; //结合用户Id 进行分库操作 
  44.         } 
  45.         return $temp_db
  46.     } 
  47.          
  48.     protected function beforeSave() 
  49.     {   
  50.         if($this->getIsNewRecord() && $this->_hasOciKey) { 
  51.                     $table=$this->getMetaData()->tableSchema; 
  52.                     $primaryKey=$table->primaryKey; 
  53.                     if($primaryKey !== null) { 
  54.                         //if($table->columns[$primaryKey]->type == 'string') //判断主键的数据类型 
  55.                         if($this->_sequenceName != ''
  56.                             $query = 'SELECT '$this->_sequenceName .'.NEXTVAL FROM dual'
  57.                         else 
  58.                             $query = 'SELECT sys_guid() FROM dual'
  59.                         $key_val = $this->getDbConnection()->createCommand($query)->queryScalar(); 
  60.                         $this->$primaryKey = $key_val
  61.                         //print_r($this->attributes);die(); 
  62.                     } 
  63.         } 
  64.         return parent::beforeSave(); 
  65.     } 

详细的使用流程这边就不赘述了,有类似需求的 欢迎留言探讨 :)