Skip to content

Commit 7044c5a

Browse files
authored
fix(doctrine): use abitrary index instead of value (#5079)
1 parent 541b738 commit 7044c5a

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed

src/Doctrine/Orm/Filter/SearchFilter.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild
179179
$parameters = [];
180180
foreach ($values as $key => $value) {
181181
$keyValueParameter = sprintf('%s_%s', $valueParameter, $key);
182-
$parameters[$caseSensitive ? $value : strtolower($value)] = $keyValueParameter;
182+
$parameters[] = [$caseSensitive ? $value : strtolower($value), $keyValueParameter];
183183

184184
$ors[] = match ($strategy) {
185185
self::STRATEGY_PARTIAL => $queryBuilder->expr()->like(
@@ -209,7 +209,9 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild
209209
}
210210

211211
$queryBuilder->andWhere($queryBuilder->expr()->orX(...$ors));
212-
array_walk($parameters, $queryBuilder->setParameter(...));
212+
foreach ($parameters as $parameter) {
213+
$queryBuilder->setParameter($parameter[1], $parameter[0]);
214+
}
213215
}
214216

215217
/**

tests/Doctrine/Common/Filter/SearchFilterTestTrait.php

+12
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,18 @@ private function provideApplyTestArguments(): array
297297
],
298298
],
299299
],
300+
'partial (multiple almost same values; case insensitive)' => [
301+
[
302+
'id' => null,
303+
'name' => 'ipartial',
304+
],
305+
[
306+
'name' => [
307+
'blue car',
308+
'Blue Car',
309+
],
310+
],
311+
],
300312
'start' => [
301313
[
302314
'id' => null,

tests/Doctrine/Odm/Filter/SearchFilterTest.php

+15
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,21 @@ public function provideApplyTestData(): array
426426
],
427427
$filterFactory,
428428
],
429+
'partial (multiple almost same values; case insensitive)' => [
430+
[
431+
[
432+
'$match' => [
433+
'name' => [
434+
'$in' => [
435+
new Regex('blue car', 'i'),
436+
new Regex('Blue Car', 'i'),
437+
],
438+
],
439+
],
440+
],
441+
],
442+
$filterFactory,
443+
],
429444
'start' => [
430445
[
431446
[

tests/Doctrine/Orm/Filter/SearchFilterTest.php

+8
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,14 @@ public function provideApplyTestData(): array
352352
],
353353
$filterFactory,
354354
],
355+
'partial (multiple almost same values; case insensitive)' => [
356+
sprintf('SELECT %s FROM %s %1$s WHERE LOWER(%1$s.name) LIKE LOWER(CONCAT(\'%%\', :name_p1_0, \'%%\')) OR LOWER(%1$s.name) LIKE LOWER(CONCAT(\'%%\', :name_p1_1, \'%%\'))', $this->alias, Dummy::class),
357+
[
358+
'name_p1_0' => 'blue car',
359+
'name_p1_1' => 'blue car',
360+
],
361+
$filterFactory,
362+
],
355363
'start' => [
356364
sprintf('SELECT %s FROM %s %1$s WHERE %1$s.name LIKE CONCAT(:name_p1_0, \'%%\')', $this->alias, Dummy::class),
357365
['name_p1_0' => 'partial'],

0 commit comments

Comments
 (0)