手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:model

Yii框架中使用PDO时强制将表字段设为小写的BUG

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

PHP代码
  1. /** 
  2.  * Creates a table column. 
  3.  * @param array $column column metadata 
  4.  * @return CDbColumnSchema normalized column metadata 
  5.  */  
  6.    protected function createColumn($column) {  
  7.        $column = array_change_key_case($column, CASE_LOWER);  
  8.        $c = new CMysqlColumnSchema;  
  9.        $c->name = $this->getDbConnection()->getColumnCase() == PDO::CASE_LOWER  
  10.                ? strtolower($column['field'])  
  11.                : ($this->getDbConnection()->getColumnCase() == PDO::CASE_UPPER ? strtoupper($column['field'])  
  12.                        : $column['field']);  
  13.        $c->rawName = $this->quoteColumnName($c->name);  
  14.        $c->allowNull = $column['null'] === 'YES';  
  15.        $c->isPrimaryKey = strpos($column['key'], 'PRI') !== false;  
  16.        $c->isForeignKey = false;  
  17.        $c->init($column['type'], $column['default']);  
  18.        $c->autoIncrement = strpos(strtolower($column['extra']), 'auto_increment') !== false;  
  19.        return $c;  
  20.    }  


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

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

PHP代码
  1. if($this->tableName[strlen($this->tableName)-1]==='*')  

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

Tags: yii, model

烂桔回忆录:如何给字段默认赋值

以下内容都是烂桔童鞋的一些回忆录,嗯,针对Yii开发的回忆录,烂桔童鞋用yii应该也有2年多了吧。所以,有些小技巧啥的还是值得看看的:
好,现在又到了不定期yii小技巧分享的时间了,今天来说说如何给字段默认赋值
一般的表里都会有类似  created的字段,记录一个数据产生的时间戳,传统的做法都是在插入数据库的时候给这个字段赋值。
在yii框架呢?方法就很多了,比如在beforeValidae()里用  $this->created  = time()  或者写个behavoir。
但我要说,这种做法弱爆了,其实有更简单的办法。
yii默认提供了一个叫  default的验证器,意思就是给字段默认赋值,那么现在重点来了,怎么是使用呢?以created字段举例:
array('created', 'default', 'value' => time(), 'setOnEmpty' => false, 'on' => 'insert'),

在model的rules()方法里,加上上面那行即可,这样,created字段就会在插入新数据的时候自动被赋值一个时间戳了。

同理也可以用在updated字段,修改 'on' => 'update'  即可

当然,这个不仅仅可以用来记录时间戳,我们操作后台的时间,往往要记录一些最后操作某条记录的某个人,同样也可以直接在这里做,非常方便,不是吗?
------------------
正在征集烂桔更多的回忆录。

Tags: yii, model