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注入实例
Oct 09 PHP
随机头像PHP版
Oct 09 PHP
域名查询代码公布
Oct 09 PHP
PHP Google的translate API代码
Dec 10 PHP
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
Jan 07 PHP
php在程序中将网页生成word文档并提供下载的代码
Oct 09 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
PHP中SQL查询语句的id=%d解释(推荐)
Dec 10 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 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 IF ELSE简化/三元一次式的使用
2011/08/22 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
jQuery插件jsonview展示json数据
2018/05/26 jQuery
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
物流仓储计划书
2014/01/10 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
普通员工辞职信范文
2015/05/12 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
使用Django框架创建项目
2022/06/10 Python