gpt4 book ai didi

php - jenssegers/laravel-mongodb 正则表达式在不工作的地方

转载 作者:可可西里 更新时间:2023-11-01 09:16:51 25 4
gpt4 key购买 nike

我正在使用 jenssegers/laravel-mongodb 开发带有 MongoDB 数据库的 Laravel API .

我正在尝试制作一个过滤器以使用正则表达式获取一些特定数据。在这个插件的教程中我发现了这个:

User::where('name', 'regex', new MongoRegex("/.*doe/i"))->get();

所以我的代码是这样的:

School::where('name', 'regex', new MongoRegex("/haags/i"))->get();

但是结果是空的。当我输出查询时,它看起来像这样:

db.schools.find({"name":{"$regex":{"regex":"haags","flags":"i"}}})

当我在控制台中使用该查询时,它显示:

error: {
"$err" : "Can't canonicalize query: BadValue $regex has to be a string",
"code" : 17287
}

我也试过:

School::where('name', 'regexp', "/haags/i")->get();

但这给了我这个查询:

db.schools.find({"name":{"$regex":"\/haag\/i"}})

这显然转义了正斜杠并使正则表达式无效。除此之外,正则表达式不应该在引号之间,或者它应该是这样的(在 MongoDB 手册中找到):

db.products.find( { description: { $regex: /^S/, $options: 'm' } } )

所以在转换为 MongoDB 查询时出现问题或者我做错了什么。谁能告诉我这是什么?

最佳答案

我发现了问题:它实际上位于类 Builder 中的函数 compileWhereBasic 中。

当where条件有3个参数时,中间运算符追加在最前面

像 {$regexp => { $regexp : "a", $options : "i"}} 第一个 "$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]];
}

代替原始代码:

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]];
}

希望对您有所帮助!

关于php - jenssegers/laravel-mongodb 正则表达式在不工作的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29558155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com