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_map array_multisort 高效处理多维数组排序
Jun 11 PHP
php 生成WML页面方法详解
Aug 09 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
php字符串截取函数用法分析
Nov 25 PHP
YiiFramework入门知识点总结(图文教程)
Dec 28 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
浅谈PHP的反射机制
Dec 15 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 PHP
Laravel框架处理用户的请求操作详解
Dec 20 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
深入理解python函数递归和生成器
2016/06/06 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python Tkinter的图片刷新实例
2019/06/14 Python
python开头的coding设置方法
2019/08/08 Python
python装饰器练习题及答案
2019/11/01 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
保安岗位职责
2014/02/21 职场文书
比赛口号大全
2014/06/10 职场文书
单位在职证明书
2014/09/11 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
车辆年检委托书范本
2014/10/14 职场文书
违纪开除通知书
2015/04/25 职场文书
导游词之南京中山陵
2019/11/27 职场文书