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 过滤危险html代码
Jun 29 PHP
PHP 编写大型网站问题集
May 07 PHP
php以post形式发送xml的方法
Nov 04 PHP
php构造函数的继承方法
Feb 09 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
详解thinkphp中的volist标签
Jan 15 PHP
详细解读php的命名空间(一)
Feb 21 PHP
laravel-admin select框默认选中的方法
Oct 03 PHP
解决php扩展安装不生效问题
Oct 25 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
angular 内存溢出的问题解决
2018/07/12 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
python生成器的使用方法
2013/11/21 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
Python如何使用字符打印照片
2020/01/03 Python
jupyter实现重新加载模块
2020/04/16 Python
计算机应用职专应届生求职信
2013/11/12 职场文书
应届毕业生求职自荐书
2014/01/03 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
Go语言空白表示符_的实例用法
2021/07/04 Golang