激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - Thinkphp使用mongodb數據庫實現多條件查詢方法

Thinkphp使用mongodb數據庫實現多條件查詢方法

2020-07-11 15:45PHP教程網 PHP教程

這篇文章主要介紹了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,$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數組,都沒了.

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 欧美激情精品久久久久久久久久 | 欧美激情综合在线 | 亚洲午夜在线视频 | 视频在线色 | 欧美精品成人 | 爱逼av| 亚洲国产精久久久久久久 | 偿还的影视高清在线观看 | 中国hdxxxx护士爽在线观看 | 久久99精品久久久久久园产越南 | 亚洲第一成人在线 | 色就色 综合偷拍区91网 | 欧美日韩1区2区 | 成人免费一区二区三区在线观看 | 国产18视频 | 精品一区二区三区在线观看国产 | asian gaysex| 92看片淫黄大片欧美看国产片 | 午夜在线视频一区二区三区 | www.mitao| 男女一边摸一边做羞羞视频免费 | 欧美成人三级视频 | 日本网站在线播放 | 免费a网| 黄色片网站在线播放 | 精国产品一区二区三区 | 亚洲午夜视频 | 亚洲视频观看 | 欧美一级做一a做片性视频 黄色网址免费进入 | 日本aaa一级片 | 欧美一级α | 天天碰天天操 | 欧美黄 片免费观看 | china对白普通话xxxx | 成人福利在线播放 | 久久久久北条麻妃免费看 | 欧美国产免费 | 久久久久久久久国产 | 黄色伊人网站 | 欧美人与性禽动交精品 | 在线观看视频日本 |