使用MongoDB数据库实现多条件查询方法ThinkPHP

有与MongoDB数据库项目,查询和ThinkPHP,根据官方手册,复合查询使用(_complex),该getlastsql查询输出,查询被发现是空的。查询字符串的模式(_string),请求查询字符串(_query)不能满足需求。通过对此MongoDB的用户估计,官方ThinkPHP支持是不够的。打开ThinkPHP MongoDB的司机,ThinkPHP / / / DB扩展驱动程序/ dbmongo.class.php功能parsethinkwhere,找到保护($美元关键,Val)方法,可以发现,没有_complex开关,也就是说,ThinkPHP MongoDB不支持复杂查询加:

复制代码代码如下所示:

案例'_complex: / /复合查询

ARR =阵列(美元);

foreach(瓦尔美元美元美元NKEY = >加拿大){

如果(strpos($ NKEY,'_)= 0!)

{

parsearr美元=美元-> parsewhereitem(NKEY美元,加拿大元);

转换对象

$ obj =新stdClass();

foreach(parsearr美元美元美元重新= > PVAL)

{

$ obj ->美元=美元重新PVAL;

}

array_push($ ARR,$ obj);

}

}

如果(isset($瓦尔{ '_logic})strtolower($瓦尔{ '_logic ' })= =){

撤消($瓦尔{ '_logic});

美元美元的查询{或} = $ ARR;

}

打破;



这里是转换对象,因为使用json_encode函数来生成查询thinkphp的使用,但如果关键的数组元素,该json_encode函数将数组转换成对象的形式,MongoDB不承认。因为只有或者,所以代码只能由。

此外,我们发现了一个bug(不知道如何计算),在parsewhere方法:

复制代码代码如下所示:

foreach(美元美元美元在关键= > Val){

如果('_id!关键0 = = = = $($键,'_ strpos ')){

特殊条件的解析表达式

原来的$查询=美元-> parsethinkwhere /($美元的关键,Val);

美元($查询,查询= array_merge美元-> parsethinkwhere($美元关键,Val));

其他{ }

安全过滤查询字段

如果(!preg_match( / ^ { a-z_ | -。a-z0-9 } + $ ,修剪($关键))){

throw_exception(L('_error_query_ ')':' $键);

}

$ =修剪(键);

如果(strpos($键,| ')){

$array =爆炸(|,美元关键);

数组();

foreach(数组$ K){

$str { } =美元-> parsewhereitem($ K $ Val);

}

$或$;

} elseif(strpos(美元的关键,)){

数组=爆炸($键);

数组();

foreach(数组$ K){

$str { } =美元-> parsewhereitem($ K $ Val);

}

查询= array_merge美元($查询,$str);

其他{ }

$str =美元-> parsewhereitem($美元关键,Val);

查询= array_merge美元($查询,$str);

}

}

}



在分析特殊条件表达式,源代码查询=美元美元-> parsethinkwhere($美元关键,Val);当特殊的表达是不是在哪里数组的第一个元素,它是错误的,和$查询得到的编码阵列别的了。