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下MYSQL limit的优化
Jan 10 PHP
五个PHP程序员工具
May 26 PHP
php 动态执行带有参数的类方法
Apr 10 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
PHP写日志的实现方法
Nov 05 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
Fleaphp常见函数功能与用法示例
Nov 15 PHP
PHP搭建大文件切割分块上传功能示例
Jan 04 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
Feb 25 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
php实现简单四则运算器
Nov 29 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常用技术文之文件操作和目录操作总结
2014/09/27 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
Python 数据结构之堆栈实例代码
2017/01/22 Python
python装饰器实例大详解
2017/10/25 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
简述安装Slackware Linux系统的过程
2012/01/12 面试题
企业治理工作自我评价
2013/09/26 职场文书
学习自我鉴定
2014/02/01 职场文书
优秀应届生求职信
2014/06/16 职场文书
个人简历自荐信
2014/06/26 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
综合办公室岗位职责
2015/04/11 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android