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语法速查表
Dec 06 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
php上传文件问题汇总
Jan 30 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
PHP-FPM之Chroot执行环境详解
Aug 03 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 PHP
PHP基于swoole多进程操作示例
Aug 12 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
xml+php动态载入与分页
2006/10/09 PHP
隐性调用php程序的方法
2009/03/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
python实现将内容分行输出
2015/11/05 Python
python实现用户登录系统
2016/05/21 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python 创建一维的0向量实例
2019/12/02 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
Python类class参数self原理解析
2020/11/19 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
建筑行业的大学生自我评价
2013/12/08 职场文书
学生会主席事迹材料
2014/01/28 职场文书
C++程序员求职信
2014/05/07 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
特岗教师个人总结
2015/02/10 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL