jenssegers/laravel-mongodb regex, где не работает

Я работаю над Laravel API с базой данных MongoDB, используя https://github.com/jenssegers/laravel-mongodb.

Я пытаюсь создать фильтр для получения определенных данных с помощью регулярных выражений. В учебнике для этого плагина я нашел это:

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 ответ

Я обнаружил проблему: на самом деле он находится в функции compileWhereBasic в классе Builder.

Когда условие 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]];
    }

Надеюсь, это поможет!

Другие вопросы по тегам