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 相关文章推荐
如何使用脚本模仿登陆过程
Nov 22 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
PHP中预定义的6种接口介绍
May 12 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
smarty内部日期函数html_select_date()用法实例分析
Jul 08 PHP
php商品对比功能代码分享
Sep 24 PHP
php发送短信验证码完成注册功能
Nov 24 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
Yii2框架redis基本应用示例
Jul 13 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图片缩放实现方法
2014/02/20 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jQuery知识点整理
2015/01/30 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
loading动画特效小结
2017/01/22 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
jQuery实现朋友圈查看图片
2020/09/11 jQuery
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
python实现外卖信息管理系统
2018/01/11 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
大学军训感言
2014/01/10 职场文书
产品委托授权书范本
2014/09/16 职场文书
教师节老师寄语
2015/05/28 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS