Yii框架的使用者越来越多,虽然大多数情况下都能够被使用的很正常,但偶尔还是有一些小问题,比如mysql对库名和表名区分大小写,但字段名不区分;这个问题就给Yii框架使用者带来很大的烦恼,特别是这个表还不是自己设计的,只是你拿来使用的,这个郁闷程度啊。
于是有人提醒我,应该这么用,在components中的db数组里加入:attributes=>array(PDO::ATTR_CASE,PDO::CASE_LOWER),以达到强制小写的目的,嗯,想法是好的,但是gii没法用了,gii直接报错,排查了半天,发现可能是CMysqlSchema这个类中的createColumn方法导致的错误,因为当你设置为列名小写后,这个方法中的一些判断却还是用的大写,于是很多变量就找不到了,没有办法继续下一步操作,于是我改了一下这个函数:

/**
* Creates a table column.
* @param array $column column metadata
* @return CDbColumnSchema normalized column metadata
*/
protected function createColumn($column) {
$column = array_change_key_case($column, CASE_LOWER);
$c = new CMysqlColumnSchema;
$c->name = $this->getDbConnection()->getColumnCase() == PDO::CASE_LOWER
? strtolower($column['field'])
: ($this->getDbConnection()->getColumnCase() == PDO::CASE_UPPER ? strtoupper($column['field'])
: $column['field']);
$c->rawName = $this->quoteColumnName($c->name);
$c->allowNull = $column['null'] === 'YES';
$c->isPrimaryKey = strpos($column['key'], 'PRI') !== false;
$c->isForeignKey = false;
$c->init($column['type'], $column['default']);
$c->autoIncrement = strpos(strtolower($column['extra']), 'auto_increment') !== false;
return $c;
}


当然上面的代码很粗燥,我也只是先临时解决这个问题,这么写之后,马上gii就恢复正常了。黑黑

顺便再说一个技巧:以前用gii的时候,对于生成model类都是一个个的输入一个个的生成,总想着应该可以批量生成,但一直不知道如何操作,直到昨天在解决上面的问题时,发现原来在gii里有这样一段代码:

if($this->tableName[strlen($this->tableName)-1]==='*')

我晶啊,原来那个表名可以写成*啊,这样就是自动生成整个数据库的model了,哎,以前居然一直没在意。