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输出xml格式字符串(用的这个)
Jul 12 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
May 09 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
总结对比php中的多种序列化
Aug 28 PHP
PHP实现关键字搜索后描红功能示例
Jul 03 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 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面向对象public private protected 访问修饰符
2013/06/30 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
php邮件发送的两种方式
2020/04/28 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
Node.js中require的工作原理浅析
2014/06/24 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
python使用分治法实现求解最大值的方法
2015/05/12 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
硕士研究生自我鉴定
2013/11/08 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
2014植树节活动总结
2014/03/11 职场文书
导师就业推荐信范文
2014/05/22 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
求职简历自我评价2015
2015/03/10 职场文书
会计岗位职责范本
2015/04/02 职场文书
导游词幽默开场白
2019/06/26 职场文书