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(8) php 数组
Mar 05 PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
Oct 27 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
10 个经典PHP函数
Oct 17 PHP
php创建sprite
Feb 11 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
Jul 24 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 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 cookies中删除的一般赋值方法
2011/05/07 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
一看就懂得Python的math模块
2018/10/21 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
python实现指定ip端口扫描方式
2019/12/17 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
上班上网检讨书
2014/01/29 职场文书
最美家庭活动方案
2014/08/31 职场文书
2014年班干部工作总结
2014/11/25 职场文书
2015年见习期工作总结
2014/12/12 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书