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令牌 Token改进版
Jul 18 PHP
php session应用实例 登录验证
Mar 16 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
Jun 17 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 PHP
ThinkPHP3.2.2的插件控制器功能简述
Jul 09 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
php实现点击可刷新验证码
Nov 07 PHP
php微信开发接入
Aug 27 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
Laravel框架源码解析之反射的使用详解
May 14 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函数的方法
2013/11/13 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
js判断变量是否未定义的代码
2020/03/28 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
python的keyword模块用法实例分析
2015/06/30 Python
详解python3实现的web端json通信协议
2016/12/29 Python
用python找出那些被“标记”的照片
2017/04/20 Python
python安装numpy&安装matplotlib& scipy的教程
2017/11/02 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
python使用selenium实现批量文件下载
2019/03/11 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
毕业生实习鉴定
2013/12/11 职场文书
校友会欢迎辞
2014/01/13 职场文书
社区党员先进事迹
2014/01/22 职场文书
公司新年寄语
2014/04/04 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL