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 14 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
php生成随机数的三种方法
Sep 10 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
PHP实现权限管理功能示例
Sep 22 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
PHP levenshtein()函数用法讲解
Mar 08 PHP
laravel 自定义常量的两种方案
Oct 14 PHP
php微信小程序解包过程实例详解
Mar 31 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中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
7个JS基础知识总结
2014/03/05 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
秋季红领巾广播稿
2014/01/27 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
厨房管理计划书
2014/04/27 职场文书
家长给学校的建议书
2014/05/15 职场文书
移交协议书
2014/08/19 职场文书
交通工程专业推荐信
2014/09/06 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android