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与ASP
Oct 09 PHP
一个ubbcode的函数,速度很快.
Oct 09 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 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来改写404错误页让你的页面更友好
2013/01/24 PHP
深入分析php之面向对象
2013/05/15 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
使用js画图之画切线
2015/01/12 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
adidas美国官网:adidas US
2016/09/21 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
职高毕业生自我鉴定
2013/10/21 职场文书
人事专员工作职责
2014/02/22 职场文书
校园环保标语
2014/06/13 职场文书
关于工作经历的证明书
2014/10/11 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
党员心得体会范文2016
2016/01/23 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
php中pcntl_fork详解
2021/04/01 PHP