gid*_*ers 5 php regex mongodb laravel-4 jenssegers-mongodb
我正在使用jenssegers / laravel-mongodb与MongoDB数据库一起使用Laravel API 。
我正在尝试使用正则表达式进行过滤以获取一些特定数据。在该插件的教程中,我发现了这一点:
User::where('name', 'regex', new MongoRegex("/.*doe/i"))->get();
Run Code Online (Sandbox Code Playgroud)
所以我的代码看起来像这样:
School::where('name', 'regex', new MongoRegex("/haags/i"))->get();
Run Code Online (Sandbox Code Playgroud)
但是结果是空的。当我输出查询时,它看起来像这样:
db.schools.find({"name":{"$regex":{"regex":"haags","flags":"i"}}})
Run Code Online (Sandbox Code Playgroud)
当我在控制台中使用该查询时,它说:
error: {
"$err" : "Can't canonicalize query: BadValue $regex has to be a string",
"code" : 17287
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
School::where('name', 'regexp', "/haags/i")->get();
Run Code Online (Sandbox Code Playgroud)
但这给了我这个查询:
db.schools.find({"name":{"$regex":"\/haag\/i"}})
Run Code Online (Sandbox Code Playgroud)
这显然转义了正斜线并使正则表达式无效。除此之外,正则表达式不应该在引号之间,或者应该是这样(在MongoDB手册中找到):
db.products.find( { description: { $regex: /^S/, $options: 'm' } } )
Run Code Online (Sandbox Code Playgroud)
因此,转换为MongoDB查询时出现问题,或者我做错了事。有人可以告诉我这是什么吗?
我发现了这个问题:它实际上位于类 Builder 中的compileWhereBasic 函数中。
当where条件有3个参数时,中间的运算符加在前面
就像 {$regexp => { $regexp : "a", $options : "i"}} 第一个“$regexp”是要附加的运算符。然而, = (已正确管理)和 regexp 的情况并非如此,不应附加。
修正是这样的:
if (! isset($operator) or in_array($operator, ['=','regex']) ) {
$query = [$column => $value];
} elseif (array_key_exists($operator, $this->conversion)) {
$query = [$column => [$this->conversion[$operator] => $value]];
} else {
$query = [$column => ['$' . $operator => $value]];
}
Run Code Online (Sandbox Code Playgroud)
而不是原始代码:
if (! isset($operator) or $operator == '=') {
$query = [$column => $value];
} elseif (array_key_exists($operator, $this->conversion)) {
$query = [$column => [$this->conversion[$operator] => $value]];
} else {
$query = [$column => ['$' . $operator => $value]];
}
Run Code Online (Sandbox Code Playgroud)
希望有帮助!
| 归档时间: |
|
| 查看次数: |
1126 次 |
| 最近记录: |