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程序设计有所帮助。