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

Я работаю над Laravel API с базой данных MongoDB, используя 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, или я делаю что-то не так. Может кто-нибудь сказать, пожалуйста, что это?

4

Решение

Я нашел проблему:
На самом деле он находится в функции 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]];
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]