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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
php include,include_once,require,require_once
Sep 05 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
Mar 19 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
php session_decode函数用法讲解
May 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多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
php限制ip地址范围的方法
2015/03/31 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
js中this对象用法分析
2018/01/05 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
说一说Python logging
2016/04/15 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
酒店led欢迎词
2014/01/09 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
2015年纪委工作总结
2015/05/13 职场文书
小学运动会加油词
2015/07/18 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android