Skip to content

Commit f1f04f7

Browse files
Better support for \\
1 parent 8d05b00 commit f1f04f7

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

src/Doctrine/Orm/Filter/PartialSearchFilter.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,21 +40,16 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q
4040
if (!is_iterable($values)) {
4141
$queryBuilder->setParameter($parameterName, $this->formatLikeValue(strtolower($values)));
4242

43-
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}($queryBuilder->expr()->like(
44-
'LOWER('.$field.')',
45-
':'.$parameterName
46-
));
43+
$likeExpression = 'LOWER('.$field.') LIKE :'.$parameterName.' ESCAPE \'\\\'';
44+
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}($likeExpression);
4745

4846
return;
4947
}
5048

5149
$likeExpressions = [];
5250
foreach ($values as $val) {
5351
$parameterName = $queryNameGenerator->generateParameterName($property);
54-
$likeExpressions[] = $queryBuilder->expr()->like(
55-
'LOWER('.$field.')',
56-
':'.$parameterName
57-
);
52+
$likeExpressions[] = 'LOWER('.$field.') LIKE :'.$parameterName.' ESCAPE \'\\\'';
5853
$queryBuilder->setParameter($parameterName, $this->formatLikeValue(strtolower($val)));
5954
}
6055

@@ -65,6 +60,6 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q
6560

6661
private function formatLikeValue(string $value): string
6762
{
68-
return '%'.addcslashes($value, '%_').'%';
63+
return '%'.addcslashes($value, '\\%_').'%';
6964
}
7065
}

tests/Functional/Parameters/PartialSearchFilterTest.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,25 @@ public static function partialSearchFilterProvider(): \Generator
119119
yield 'filter by partial name "%"' => [
120120
'/chickens?namePartial=%25',
121121
1,
122-
['xx_%_\_%_xx'],
122+
['xx_%_\\_%_xx'],
123123
];
124124

125125
yield 'filter by partial name "_"' => [
126-
'/chickens?namePartial=_',
126+
'/chickens?namePartial=%5F',
127127
1,
128-
['xx_%_\_%_xx'],
128+
['xx_%_\\_%_xx'],
129129
];
130130

131131
yield 'filter by partial name "\"' => [
132132
'/chickens?namePartial=%5C',
133133
1,
134-
['xx_%_\_%_xx'],
134+
['xx_%_\\_%_xx'],
135+
];
136+
137+
yield 'filter by partial name "\_"' => [
138+
'/chickens?namePartial=%5C%5F',
139+
1,
140+
['xx_%_\\_%_xx'],
135141
];
136142
}
137143

@@ -158,7 +164,7 @@ private function loadFixtures(): void
158164
$chicken2->setChickenCoop($chickenCoop2);
159165

160166
$chicken3 = new $chickenClass();
161-
$chicken3->setName('xx_%_\_%_xx');
167+
$chicken3->setName('xx_%_\\_%_xx');
162168
$chicken3->setChickenCoop($chickenCoop1);
163169

164170
$chickenCoop1->addChicken($chicken1);

0 commit comments

Comments
 (0)