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 Smarty模板生成html文档的方法
Apr 12 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
Jun 03 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
Ubuntu12下编译安装PHP5.3开发环境
Mar 27 PHP
详解PHP数组赋值方法
Nov 07 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
Dec 29 PHP
php session的应用详细介绍
Mar 22 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
Yii2第三方类库插件Imagine的安装和使用
Jul 06 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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数组和explode函数示例总结
2015/05/08 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
PHP微信支付实例解析
2016/07/22 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
JavaScript修改css样式style
2008/04/15 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python中open函数的基本用法示例
2019/09/07 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
python如何代码集体右移
2020/07/20 Python
python dict如何定义
2020/09/02 Python
Django跨域请求原理及实现代码
2020/11/14 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
师范生实习自我鉴定
2013/11/01 职场文书
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
运动会领导邀请函
2014/01/10 职场文书
员工安全生产承诺书
2014/05/22 职场文书
高一军训口号
2015/12/25 职场文书