Thinkphp使用mongodb数据库实现多条件查询方法


Posted in PHP onJune 26, 2014

有个项目用了mongodb数据库,查询条件有and也有or,按Thinkphp官方手册,使用复合查询(_complex),getLastSql输出查询语句,发现查询条件是空的.用字符串模式查询(_string),请求字符串查询(_query)无法满足需求.估计用mongodb的用户不多,thinkphp官方对这方面支持也不够.打开thinkphp的mongodb驱动,Thinkphp/Extend/Driver/Db/DbMongo.class.php,找到protected function parseThinkWhere($key,$val)方法,可以发现,switch里没有_complex,也就是说,Thinkphp使用mongodb时,根本不支持复合查询.加上:

case '_complex'://复合查询

             $arr   = array();

             foreach ($val as $nkey=>$nval){

              if( strpos($nkey,'_')!=0)

              {

               $parseArr=$this->parseWhereItem($nkey,$nval);

               //转换成对象

               $obj=new stdClass();

               foreach ($parseArr as $pkey=>$pval)

               {

                $obj->$pkey=$pval;

               }

               array_push($arr, $obj);

              }

             }

             if(isset($val['_logic']) && strtolower($val['_logic']) == 'or' ) {

              unset($val['_logic']);

              $query['$or']   =  $arr;

             }

             break;

这里之所以要转换成对象,是因为使用thinkphp使用json_encode函数生成查询语句,但是如果数组元素带key,json_encode函数会把数组转换成对象的形式,mongodb不能识别.因为目前只用到or,所以,代码只对or作了处理.
另外,发现个BUG(不知道算不算),在parseWhere方法中:

foreach ($where as $key=>$val){

            if('_id' != $key && 0===strpos($key,'_')) {

                // 解析特殊条件表达式

                //原 $query=$this->parseThinkWhere($key,$val);

                $query   = array_merge($query,$this->parseThinkWhere($key,$val));

            }else{

                // 查询字段的安全过滤

                if(!preg_match('/^[A-Z_\|\&\-.a-z0-9]+$/',trim($key))){

                    throw_exception(L('_ERROR_QUERY_').':'.$key);

                }

                $key = trim($key);

                if(strpos($key,'|')) {

                    $array   =  explode('|',$key);

                    $str   = array();

                    foreach ($array as $k){

                        $str[]   = $this->parseWhereItem($k,$val);

                    }

                    $query['$or'] =    $str;

                }elseif(strpos($key,'&')){

                    $array   =  explode('&',$key);

                    $str   = array();

                    foreach ($array as $k){

                        $str[]   = $this->parseWhereItem($k,$val);

                    }

                    $query   = array_merge($query,$str);

                }else{

                    $str   = $this->parseWhereItem($key,$val);

                    $query   = array_merge($query,$str);

                }

            }

        }

解析特殊条件表达式时,源代码里是$query=$this->parseThinkWhere($key,$val);当特殊表达式在where数组里不是第一个元素时,就出错了,else里的代码得到的$query数组,都没了.

PHP 相关文章推荐
PHP4.04简明安装
Oct 09 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
PHP关联链接常用代码
Nov 05 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
php实现微信扫码支付
Mar 26 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 #PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 #PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 #PHP
ThinkPHP多表联合查询的常用方法
Mar 24 #PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 #PHP
ThinkPHP查询中的魔术方法简述
Jun 25 #PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 #PHP
You might like
在PHP的图形函数中显示汉字
2006/10/09 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
网页javascript精华代码集
2007/01/24 Javascript
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
详解vue-cli 接口代理配置
2017/12/13 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
js实现扫雷源代码
2020/11/27 Javascript
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
法律专业推荐信范文
2013/11/29 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
5s标语大全
2014/06/23 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
运动会致辞稿
2015/07/29 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript