使用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);当特殊的表达是不是在哪里数组的第一个元素,它是错误的,和$查询得到的编码阵列别的了。