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 Smarty生成EXCEL文档的代码
Aug 23 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
关于php中一些字符串总结
May 05 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 16 PHP
yii2安装详细流程
May 23 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 PHP
PHP7 新增功能
Mar 09 PHP
PHP使用非对称加密算法RSA
Apr 21 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 和 MySQL 基础教程(一)
2006/10/09 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
Python的迭代器和生成器使用实例
2015/01/14 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
python中reader的next用法
2018/07/24 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python 递归相关知识总结
2021/03/03 Python
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
网吧消防安全制度
2014/01/28 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
高一新生军训方案
2014/05/12 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
公司员工离职证明书
2014/10/04 职场文书
会计工作总结范文2014
2014/12/23 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书