Thinkphp使用mongodb数据库达成多规格查询格局

剖判非常条件表明式时,源代码里是$query=$this->parseThinkWhere($key,$val卡塔尔(قطر‎;当新鲜表明式在where数组里不是率先个要素时,就出错了,else里的代码获得的$query数组,都没了.


复制代码 代码如下:
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使用mongodb数据库完结多规格查询艺术,更改了mongodb驱动文件来兑现复合查询、多规格查询,供给的对象能够参照下
澳门新萄京, 有个种类用了mongodb数据库,查询条件有and也可以有or,按Thinkphp官方手册,使用复合查询(_complex),getLastSql输出查询语句,开采查询条件是空的.用字符串情势查询(_string),央浼字符串查询(_query)不或许满意需要.测度用mongodb的客商十分少,thinkphp官方对那方面援助也远远不足.张开thinkphp的mongodb驱动,Thinkphp/Extend/Driver/Db/DbMongo.class.php,找到protected
function
parseThinkWhere($key,$valState of Qatar方法,能够窥见,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数组,都没了.
 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图