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 XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
php流量统计功能的实现代码
Sep 29 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
php 启动时报错的简单解决方法
Jan 27 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
浅析php原型模式
Nov 25 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
PHP自定义错误处理的方法分析
Dec 19 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 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
Zerg建筑一览
2020/03/14 星际争霸
PHP也可以?成Shell Script
2006/10/09 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
Python简单计算文件夹大小的方法
2015/07/14 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python rstrip()方法实例详解
2018/11/11 Python
python的继承知识点总结
2018/12/10 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
佳能德国网上商店:Canon德国
2017/03/18 全球购物
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
公司股权转让协议书
2014/04/12 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
工作保证书
2015/01/17 职场文书
教师聘用意向书
2015/05/11 职场文书
酒会开场白大全
2015/06/01 职场文书
毕业证明书
2015/06/19 职场文书
高二语文教学反思
2016/02/16 职场文书