ホームページ >バックエンド開発 >PHPチュートリアル >Thinkphp は mongodb データベースを使用して複数条件クエリメソッドを実装します_PHP チュートリアル

Thinkphp は mongodb データベースを使用して複数条件クエリメソッドを実装します_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:26:13975ブラウズ

mongodbデータベースを使用するプロジェクトがあり、クエリ条件にandとorが含まれています。Thinkphpの公式マニュアルによると、getLastSqlはクエリ文を出力し、文字列モードクエリを使用します。文字列クエリ (_query) をリクエストするための (_string) は需要を満たすことができません。mongodb を使用しているユーザーは多くないと推測され、この点に関しては thinkphp 公式サポートでは十分ではありません。 thinkphp の mongodb ドライバー (Thinkphp/Extend/Driver) を開きます。 /Db/DbMongo.class.php を開き、保護された関数を見つけます。 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 ($pkey=>$pval として $parseArr)
                                                              $obj->$pkey=$pval;
}
array_push($arr, $obj);
}
}
If(isset($val['_logic']) && strto lower($val['_logic']) == 'or' ) {
unset($val['_logic']);
$query['$or'] = $arr;
}
休憩;



ここでオブジェクトに変換する必要がある理由は、thinkphp が json_encode 関数を使用してクエリ ステートメントを生成するためです。ただし、配列要素にキーがある場合、json_encode 関数は配列をオブジェクト形式に変換しますが、mongodb では変換できません。現在 or のみが使用されているため、コードは or のみを処理します。 さらに、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));
}その他{
// クエリフィールドのセキュリティフィルタリング
If(!preg_match('/^[A-Z_|&-.a-z0-9]+$/',trim($key))){
throw_Exception(L('_ERROR_QUERY_').':'.$key);
}
$key = トリム($key);
If(strpos($key,'|')) {
$array =explode('|',$key);
                                            foreach ($array as $k){
$str[] = $this->parseWhereItem($k,$val);
}
$query['$or'] = $str;
}elseif(strpos($key,'&')){
$array =explode('&',$key);
                                            foreach ($array as $k){
$str[] = $this->parseWhereItem($k,$val);
}
$query = array_merge($query,$str);
}その他{
$str = $this->parseWhereItem($key,$val);
$query = array_merge($query,$str);
}
}
}

特別な条件式を解析するとき、ソース コードは $query=$this->parseThinkWhere($key,$val); 特別な式が where 配列の最初の要素でない場合はエラーが発生し、else の場合は $コードで取得したクエリ配列が消えてしまいました

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/824792.html技術記事 mongodb データベースを使用するプロジェクトがあります。 Thinkphp の公式マニュアルによると、複合クエリ (_complex) を使用すると、クエリ条件が空であることがわかります。 ..
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。