【问题标题】:jenssegers/laravel-mongodb regex in where not workingjenssegers/laravel-mongodb 正则表达式在哪里不工作
【发布时间】:2015-06-15 23:29:58
【问题描述】:

我正在使用 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 查询时出现问题,或者我做错了什么。谁能告诉我这是什么?

【问题讨论】:

  • 您的问题有解决方案吗?我也有 ;-) 谢谢
  • 我停止使用 mongoDB 并继续前进,问题太多了......
  • 2016-07-31 - 同样的问题...

标签: php regex mongodb laravel-4 jenssegers-mongodb


【解决方案1】:

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

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

Like {$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]];
    }

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2019-03-28
    • 2017-06-15
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多