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+mysql留言本源码
Nov 11 PHP
php基础学习之变量的使用
Jun 09 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
php二分查找二种实现示例
Mar 12 PHP
php获取json数据所有的节点路径
May 17 PHP
PHP制作登录异常ip检测功能的实例代码
Nov 16 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
phpmyadmin下载、安装、配置教程
May 16 PHP
php实现用户注册密码的crypt加密
Jun 08 PHP
ThinkPHP 3使用OSS的方法
Jul 19 PHP
PHP使用Session实现上传进度功能详解
Aug 06 PHP
详解Go与PHP的语法对比
May 29 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
php4的session功能评述(二)
2006/10/09 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
js实现点赞效果
2020/03/16 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
python使用xmlrpc实例讲解
2013/12/17 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
J2EE模式面试题
2016/10/11 面试题
大学军训感言600字
2014/02/25 职场文书
施工安全汇报材料
2014/08/17 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
繁星春水读书笔记
2015/06/30 职场文书
关爱空巢老人感想
2015/08/11 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
如何用PHP实现多线程编程
2021/05/26 PHP
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript