ThinkPHP实现转换数据库查询结果数据到对应类型的方法


Posted in PHP onNovember 16, 2017

本文实例讲述了ThinkPHP实现转换数据库查询结果数据到对应类型的方法。分享给大家供大家参考,具体如下:

最近使用 ThinkPHP3.2.3 进行 API 开发,发现 ThinkPHP3.x 查询数据库返回所有字段值类型都是 String。以前开发 web 的时候没怎么注意这个,现在发现用到 API 开发很难办,数据类型不对,不能每个字段都让客户端自己强制转换一下。

查资料后发现 ThinkPHP3.x 的 Model.class.php,提供了 _parseType 方法,在查询完以后进行类型转换,但需要我们手工调一下。

需要自己写一个 Model 基类:

MBaseModel.class.php 继承自 Model

use Think\Model;
class BaseModel extends Model
{
  protected function _after_select(&$resultSet, $options)
  {
    parent::_after_select($resultSet,$options);
    foreach ($resultSet as &$result) {
      $this->_after_find($result, $options);
    }
  }
  protected function _after_find(&$result, $options)
  {
    parent::_after_find($result,$options);
    foreach ($result as $field => $value) {
      $this->_parseType($result, $field);
    }
  }
}

然后所有自己写的 Model 类都继承自 MBaseModel.

注意:必须把上面两个方法写到 Model 的子类中。

本来,这样已经搞定了,但发现 Model.class.php 的 _parseType 方法里有个低级 bug:

/**
* 数据类型检测
* @access protected
* @param mixed $data 数据
* @param string $key 字段名
* @return void
*/
protected function _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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP下几种删除目录的方法总结
Aug 19 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
小谈php正则提取图片地址
Mar 27 PHP
CI(CodeIgniter)框架配置
Jun 10 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
Laravel下生成验证码的类
Nov 15 #PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 #PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 #PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 #PHP
PHP中递归的实现实例详解
Nov 14 #PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 #PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 #PHP
You might like
剖析 PHP 中的输出缓冲
2006/12/21 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
JS框架之vue.js(深入三:组件1)
2016/09/29 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
Python 可爱的大小写
2008/09/06 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
python推导式的使用方法实例
2021/02/28 Python
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
什么是servlet
2012/05/08 面试题
学生实习推荐信范文
2013/11/26 职场文书
2014全国两会心得体会
2014/03/17 职场文书
租房协议书
2014/04/10 职场文书
亲子活动总结
2014/04/26 职场文书
水利水电专业自荐信
2014/07/08 职场文书
名人演讲稿范文
2014/09/16 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书