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模板技术[转]
Jan 04 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
分享PHP header函数使用教程
Sep 05 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
PHP获取毫秒级时间戳的方法
Apr 15 PHP
深入理解PHP变量的值类型和引用类型
Oct 21 PHP
ThinkPHP实现附件上传功能
Apr 27 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 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 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
php 数组元素快速去重
2017/05/05 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
Javascript的闭包详解
2014/12/26 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
javascript实现简单留言板案例
2021/02/09 Javascript
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
读书活动总结
2014/04/28 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
教师工作表现评语
2014/12/31 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
社区党务工作总结2015
2015/05/19 职场文书
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS