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 相关文章推荐
Windows下PHP的任意文件执行漏洞
Oct 09 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
Oct 09 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
Apr 09 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php中define用法实例
Jul 30 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP7 弃用功能
Mar 09 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP常用数组函数介绍
2014/07/28 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
Python文件去除注释的方法
2015/05/25 Python
python 检查文件mime类型的方法
2018/12/08 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
教师师德反思材料
2014/02/15 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
党在我心中演讲稿
2014/09/02 职场文书
中国世界遗产导游词
2015/02/13 职场文书
幼儿教师辞职信
2015/02/27 职场文书
导游词之吉林花园山
2019/10/17 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL