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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
浅谈php中mysql与mysqli的区别分析
Jun 10 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
nginx+thinkphp下解决不支持pathinfo模式
Jul 01 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
PHP文件上传处理案例分析
Oct 15 PHP
thinkphp关于简单的权限判定方法
Apr 03 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
PHP 对接美团大众点评团购券(门票)的开发步骤
Apr 03 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 excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
php输入数据统一类实例
2015/02/23 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
PHP静态成员变量
2017/02/14 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
php微信公众号开发之简答题
2018/10/20 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
script不刷新页面的联动前后代码
2013/09/18 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
金融专业大学生自我评价
2014/01/09 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
婚前财产协议书范本
2014/10/19 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
个人汇报材料范文
2014/12/30 职场文书