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)三
Oct 09 PHP
PHP制作图型计数器的例子
Oct 09 PHP
用函数读出数据表内容放入二维数组
Oct 09 PHP
php 时间计算问题小结
Jan 04 PHP
两个开源的Php输出Excel文件类
Feb 08 PHP
php设计模式 State (状态模式)
Jun 26 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
PHP的时间戳与具体时间转化的简单实现
Jun 13 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
php微信开发之音乐回复功能
Jun 14 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 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 GD绘制24小时柱状图
2008/06/28 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
javascript的push使用指南
2014/12/05 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
Python实现查找系统盘中需要找的字符
2015/07/14 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
python动态视频下载器的实现方法
2019/09/16 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
工程部主管岗位职责
2013/11/17 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
cf收人广告词大全
2014/03/14 职场文书
教师党员公开承诺书
2014/03/25 职场文书
《春晓》教学反思
2014/04/20 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
黄河绝恋观后感
2015/06/08 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
Python实现简单得递归下降Parser
2022/05/02 Python
MySQL安装失败的原因及解决步骤
2022/06/14 MySQL