因为框架内联绝大多数代码是未进行引号包裹的。
oracle 纯sql的情况下,默认当做大写,影响很大。只能统一数据库和字段,表名大写转移。
Ar 兼容小写处理
编写 CActiveRecordO 集成 CActiveRecord
修改以下函数进行小写兼容
$model->field
public function __get($name) {
$upname = strtoupper ( $name );
if (isset ( $this->_attributes [$upname] )) {
return $this->_attributes [$upname];
} elseif (isset ( $this->getMetaData ()->columns [$upname] ))
return null;
elseif (isset ( $this->_related [$name] ))
return $this->_related [$name];
elseif (isset ( $this->getMetaData ()->relations [$name] ))
return $this->getRelated ( $name );
else
return parent::__get ( $name );
}
$model->field=val;
public function __set($name, $value) {
$upname = strtoupper ( $name );
if (($this->setAttribute ( $name, $value ) === false && $this->setAttribute ( $upname, $value ) === false)) {
if (isset ( $this->getMetaData ()->relations [$name] ))
$this->_related [$name] = $value;
else
parent::__set ( $name, $value );
}
$name = $upname;
}
empty($model->field) //判断
public function __isset($name) {
$upname = strtoupper ( $name );
if (isset ( $this->_attributes [$upname] ))
return true;
elseif (isset ( $this->getMetaData ()->columns [$upname] ))
return false;
elseif (isset ( $this->_related [$name] ))
return true;
elseif (isset ( $this->getMetaData ()->relations [$name] ))
return $this->getRelated ( $name ) !== null;
else
return parent::__isset ( $name );
}
默认 getAttributes setAttributes 抱成别的函数进行重写,因为内部调用太多地方,不可直接重写该函数,另外编写函数getAttributesWithO 之类的即可
public function getAttributesWithO($names = true) {
$attributes = $this->getAttributes ( $names );
$attributes = array_change_key_case ( $attributes, CASE_LOWER );
return $attributes;
}
public function setAttributesWithO($attributes = array(), $safeOnly = true, $hasClob = false) {
$attributes = array_change_key_case ( $attributes, CASE_UPPER );
if ($hasClob && $this->getMetaData ()->columns && is_array ( $this->getMetaData ()->columns )) {
foreach ( $this->getMetaData ()->columns as $key => $column ) {
if (stristr ( $column->dbType, "CLOB" ) && empty ( $attributes [$key] )) {
$attributes [$key] = '';
}
}
}
$this->setAttributes ( $attributes, $safeOnly );
}
public function getClobByKey($key) {
if (! empty ( $this->$key ) && is_object ( $this->$key ) && get_class ( $this->$key ) == 'OCI-Lob') {
$this->$key = $this->$key->read ( 50000 );
}
}
pdo 对clob各种奇葩问题。需要调整pdo为oci8相关处理
http://www.yiiframework.com/extension/oci8pdo/
public function afterFind() {
$this->getClobByKey ( 'description' );
return true;
}
内部组件需要进行特殊处理。
主要出现在需要调用数据库实现相关功能的组件,如:CDbAuthManager,CDbHttpSession
重写相关即可
主要为大小写冲突问题。
public function hasItemChild($itemName,$childName)
{
return $this->db->createCommand()
->select('parent')
->from($this->itemChildTable)
->where('parent=:parent AND child=:child', array(
':parent'=>$itemName,
':child'=>$childName))
->queryScalar() !== false;
}
select (‘parent’) 会返回 select “parent” 导致大小写异常,where parent =又是小写处理,纠结吧。。。
所以只能将被小写了的地方进行大写转换处理。
将被大写返回的数组,需要进行小写转换下。
$row=array_change_key_case ( $row, CASE_LOWER );
oci 修复个setFetchModel的小异常问题,兼容有点问题,不过只在权限判断中出现,其它暂时未发现
http://www.php.net/manual/en/pdostatement.setfetchmode.php
public function setFetchMode($mode, $colClassOrObj = null, array $ctorArgs = array()) {
// yii 内部调用
// parent::setFetchMode($mode,$colClassOrObj,$ctorArgs);
// return true;
if ($mode == PDO::FETCH_COLUMN||$mode==PDO::FETCH_ASSOC) {
$this->_fetchMode = $mode;
return true;
}
// 52: $this->_statement->setFetchMode(PDO::FETCH_ASSOC);
if ($colClassOrObj !== null || ! empty ( $ctorArgs )) {
throw new PDOException ( 'Second and third parameters are not implemented for Oci8PDO_Statement::setFetchMode()' );
// see http://www.php.net/manual/en/pdostatement.setfetchmode.php
}
$this->_fetchMode = $mode;
return true;
}