这边自定义了一个CActiveRecord的子类
废话不说了 直接上代码
- class OciActiveRecord extends CActiveRecord
- {
- protected $_hasOciKey = true; //是否使用Oracle主键(单一主键=> 序列 | guid) 设置为false时,可用于mysql 分库操作
- protected $_sequenceName = ''; //使用的序列名称
- protected $_dbName = ''; // 使用的数据库配置名称 ,优先级较高
- protected $_dbUser = ''; // 通过用户 选择数据库 (可选择使用数据库用户名,或访问用户id 等)
- public function setSequence($sequenceName) {
- $this->_sequenceName = $sequenceName;
- }
- public function getSequence() {
- return $this->_sequenceName;
- }
- public function setDbName($dbName){
- $this->_dbName = $dbName;
- }
- public function getDbName(){
- return $this->_dbName;
- }
- public function setDbUser($dbUser){
- $this->_dbUser = $dbUser;
- }
- public function getDbUser(){
- return $this->_dbUser;
- }
- public function getDbConnection() {
- $t_db = 'db';
- if($this->_dbName != '')
- $t_db = $this->_dbName;
- else if($this->_dbUser !='')
- $t_db = $this->chooseDb($this->_dbUser);
- parent::$db = Yii::app()->getComponent($t_db);
- return parent::getDbConnection();
- }
- private function chooseDb($temp_user){ //判断数据库用户名 返回对应的数据库配置名称
- $temp_db = 'db';
- switch($temp_user) { //some examples
- case 'wj': $temp_db = 'dbtest'; break;
- //case 'hr': $temp_db = 'test'; break;
- //case $temp_user >= 100000 && $temp_user <= 199999: $temp_db = 'dbu2'; break; //结合用户Id 进行分库操作
- }
- return $temp_db;
- }
- protected function beforeSave()
- {
- if($this->getIsNewRecord() && $this->_hasOciKey) {
- $table=$this->getMetaData()->tableSchema;
- $primaryKey=$table->primaryKey;
- if($primaryKey !== null) {
- //if($table->columns[$primaryKey]->type == 'string') //判断主键的数据类型
- if($this->_sequenceName != '')
- $query = 'SELECT '. $this->_sequenceName .'.NEXTVAL FROM dual';
- else
- $query = 'SELECT sys_guid() FROM dual';
- $key_val = $this->getDbConnection()->createCommand($query)->queryScalar();
- $this->$primaryKey = $key_val;
- //print_r($this->attributes);die();
- }
- }
- return parent::beforeSave();
- }
- }
详细的使用流程这边就不赘述了,有类似需求的 欢迎留言探讨 :)