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数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
Nov 07 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
php字符串函数学习之strstr()
Mar 27 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
php简单判断文本编码的方法
Jul 30 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
PHP crc32()函数讲解
Feb 14 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
PHP标准库 (SPL)――Countable用法示例
Jun 05 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 输出简单动态WAP页面
2009/06/09 PHP
php explode函数实例代码
2012/02/27 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
JavaScript全局函数使用简单说明
2011/03/11 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
python执行get提交的方法
2015/04/29 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
详解Python中for循环是如何工作的
2017/06/30 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
机器学习实战之knn算法pandas
2019/06/22 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
初三政治教学反思
2014/01/30 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
应届生求职信范文
2014/06/30 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP