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 相关文章推荐
我的群发邮件程序
Oct 09 PHP
php 分页类 扩展代码
Jun 11 PHP
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
PHP数组操作――获取数组最后一个值的方法
Apr 14 PHP
PHP模板解析类实例
Jul 09 PHP
PHP生成条形码大揭秘
Sep 24 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 PHP
Laravel使用模型实现like模糊查询的例子
Oct 24 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 smarty模版引擎中的缓存应用
2009/12/11 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
PHP 读取Postgresql中的数组
2013/04/14 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python类定义的讲解
2013/11/01 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
使用pip安装python库的多种方式
2019/07/31 Python
python 安装impala包步骤
2020/03/28 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
python与idea的集成的实现
2020/11/20 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
安全生产投入制度
2014/01/29 职场文书
企业节能减排实施方案
2014/03/19 职场文书
护士节策划方案
2014/05/19 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
中职生求职信
2014/07/01 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python