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高级对象构建 多个构造函数的使用
Feb 05 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
Feb 28 PHP
php 获取本地IP代码
Jun 23 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
Smarty使用自定义资源的方法
Aug 08 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
crontab无法执行php的解决方法
Jan 25 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
php版微信自定义回复功能示例
Dec 05 PHP
thinkphp分页集成实例
Jul 24 PHP
Laravel框架实现简单的学生信息管理平台案例
May 07 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
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
js文字横向滚动特效
2015/11/11 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
Python可变参数函数用法实例
2015/07/07 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
如何执行一个shell程序
2012/11/23 面试题
网络信息管理员岗位职责
2014/01/05 职场文书
毕业自我评价
2014/02/05 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
电子商务实训报告总结
2014/11/05 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
运动会观后感
2015/06/09 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python