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使用者状态管理功能的应用
Oct 09 PHP
防止MySQL注入或HTML表单滥用的PHP程序
Jan 21 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
php中多维数组按指定value排序的实现代码
Aug 19 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
php实现对象克隆的方法
Jun 20 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
php常用字符函数实例小结
Dec 29 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
php把文件设置为插件的技巧方法
Feb 03 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
简单的页面缓冲技术
2006/10/09 PHP
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
javascript数组的扩展实现代码集合
2008/06/01 Javascript
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
体育教育个人自荐信范文
2013/12/01 职场文书
自荐信需注意事项
2014/01/25 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
个人授权委托书范本
2014/09/14 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL