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 相关文章推荐
判“新”函数:得到今天与明天的秒数
Oct 09 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 PHP
php实现的二分查找算法示例
Jun 20 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
tp5框架内使用tp3.2分页的方法分析
May 05 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
JavaScript 对象字面量讲解
2016/06/06 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python中endswith()函数的基本使用
2015/04/07 Python
Python实现定时任务
2017/02/08 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
python创建学生管理系统
2019/11/22 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
JPA的特点
2014/10/25 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
企业节能减排实施方案
2014/03/19 职场文书
付款委托书范本
2014/04/04 职场文书
安全责任协议书
2014/04/21 职场文书
端午节活动总结报告
2015/02/11 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS