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你的验证码安全码?
Jan 02 PHP
PHP获取类中常量,属性,及方法列表的方法
Apr 09 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
PHP中设置时区方法小结
Jun 03 PHP
PHP闭包(Closure)使用详解
May 02 PHP
Chrome Web App开发小结
Sep 04 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP针对多用户实现更换头像功能
Sep 04 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
PHP安装BCMath扩展的方法
Feb 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 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
自写的一个jQuery圆角插件
2010/10/26 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
python简单实现旋转图片的方法
2015/05/30 Python
基于python时间处理方法(详解)
2017/08/14 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
html5的localstorage详解
2017/05/09 HTML / CSS
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
铁路工务反思材料
2014/02/07 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
房地产推广策划方案
2014/05/19 职场文书
运动会加油稿20字
2014/11/15 职场文书
师德师风事迹材料
2014/12/20 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
python中的sys模块和os模块
2022/03/20 Python