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了,哎,以前居然一直没在意。