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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
php页面防重复提交方法总结
Nov 25 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
Jun 29 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 PHP
PHP连接MySQL数据库操作代码实例解析
Jul 11 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极大的增强功能和性能
2006/10/09 PHP
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
Javascript学习笔记二 之 变量
2010/12/15 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python实现一个简单的MySQL类
2015/01/07 Python
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
python__name__原理及用法详解
2019/11/02 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
Python requests上传文件实现步骤
2020/09/15 Python
python 发送get请求接口详解
2020/11/17 Python
初婚未育未抱养证明
2014/01/12 职场文书
应届生求职信范文
2014/06/30 职场文书
质量月活动总结
2014/08/26 职场文书
招标承诺书
2014/08/30 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers