Я работаю над 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, или я делаю что-то не так. Может кто-нибудь сказать, пожалуйста, что это?
Я нашел проблему:
На самом деле он находится в функции 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]];
}
Надеюсь, это поможет !
Других решений пока нет …