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将会员数据导入到ucenter的代码
Jul 18 PHP
php中设置index.php文件为只读的方法
Feb 06 PHP
php 模拟get_headers函数的代码示例
Apr 27 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
示例详解Laravel的注册重构
Aug 14 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 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使用实例
2015/07/02 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
什么是python的函数体
2020/06/19 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
外贸实习生自荐信范文
2013/11/24 职场文书
魅力教师事迹材料
2014/01/10 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
公司酒会致辞
2015/07/30 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
Echarts如何重新渲染实例详解
2022/05/30 Javascript