ThinkPHP实现转换数据库查询结果数据到对应类型的方法
本文实例讲述了ThinkPHP实现转换数据库查询结果数据到对应类型的方法。分享给大家供大家参考,具体如下:
最近使用ThinkPHP3.2.3进行API开发,发现ThinkPHP3.x查询数据库返回所有字段值类型都是String。以前开发web的时候没怎么注意这个,现在发现用到API开发很难办,数据类型不对,不能每个字段都让客户端自己强制转换一下。
查资料后发现ThinkPHP3.x的Model.class.php,提供了_parseType方法,在查询完以后进行类型转换,但需要我们手工调一下。
需要自己写一个Model基类:
MBaseModel.class.php继承自Model
useThink\Model; classBaseModelextendsModel { protectedfunction_after_select(&$resultSet,$options) { parent::_after_select($resultSet,$options); foreach($resultSetas&$result){ $this->_after_find($result,$options); } } protectedfunction_after_find(&$result,$options) { parent::_after_find($result,$options); foreach($resultas$field=>$value){ $this->_parseType($result,$field); } } }
然后所有自己写的Model类都继承自MBaseModel.
注意:必须把上面两个方法写到Model的子类中。
本来,这样已经搞定了,但发现Model.class.php的_parseType方法里有个低级bug:
/** *数据类型检测 *@accessprotected *@parammixed$data数据 *@paramstring$key字段名 *@returnvoid */ protectedfunction_parseType(&$data,$key){ if(!isset($this->options['bind'][':'.$key])&&isset($this->fields['_type'][$key])){ $fieldType=strtolower($this->fields['_type'][$key]); if(false!==strpos($fieldType,'enum')){ //支持ENUM类型优先检测 }elseif(false===strpos($fieldType,'bigint')&&false!==strpos($fieldType,'int')){ $data[$key]=intval($data[$key]); }elseif(false!==strpos($fieldType,'float')||false!==strpos($fieldType,'double')){ $data[$key]=floatval($data[$key]); }elseif(false!==strpos($fieldType,'bool')){ $data[$key]=(bool)$data[$key]; } } } //上面第13行修改为 }elseif(false!==strpos($fieldType,'bigint')||false!==strpos($fieldType,'int')||false!==strpos($fieldType,'tinyint')){
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《ZendFrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。