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 相关文章推荐
分页显示Oracle数据库记录的类之二
Oct 09 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
php中hashtable实现示例分享
Feb 13 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
php微信开发之上传临时素材
Jun 24 PHP
php_pdo 预处理语句详解
Nov 21 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
laravel多条件查询方法(and,or嵌套查询)
Oct 09 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
合作指挥官:孟斯克
2020/03/16 星际争霸
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python创建xml的方法
2015/03/10 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
Python内置函数及功能简介汇总
2020/10/13 Python
Python排序函数的使用方法详解
2020/12/11 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
技术学校毕业生求职信分享
2013/12/02 职场文书
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
学徒工职责
2014/03/06 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python
Python采集股票数据并制作可视化柱状图
2022/04/04 Python
如何使用python包中的sched事件调度器
2022/04/30 Python