jenssegers / laravel-mongodb正则表达式在哪里不工作

时间:2015-04-10 09:41:46

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

我正在使用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查询时出现问题,或者我做错了什么。有人可以告诉我它是什么吗?

1 个答案:

答案 0 :(得分:0)

我发现了这个问题: 它实际上是在类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]];
    }

而不是原始代码:

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

希望有所帮助!