Skip to content

Commit 9ee1afd

Browse files
authored
Merge pull request #91 from perplorm/fix_array_contains
fix query structure with array contains
2 parents 35a520c + 575803e commit 9ee1afd

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

src/Propel/Generator/Builder/Om/QueryBuilder.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,17 +1089,17 @@ public function filterBy$colPhpName(\$$variableName = null, ?string \$comparison
10891089
}";
10901090
} elseif ($col->getType() == PropelTypes::PHP_ARRAY) {
10911091
$script .= "
1092-
if (
1093-
\$comparison === null
1094-
|| \$comparison === Criteria::CONTAINS_ALL
1095-
|| \$comparison === Criteria::CONTAINS_SOME
1096-
|| \$comparison === Criteria::CONTAINS_NONE
1097-
) {
1092+
\$arrayOps = [null, Criteria::CONTAINS_ALL, Criteria::CONTAINS_SOME, Criteria::CONTAINS_NONE];
1093+
if (in_array(\$comparison, \$arrayOps, true)) {
10981094
\$andOr = (\$comparison === Criteria::CONTAINS_SOME) ? Criteria::LOGICAL_OR : Criteria::LOGICAL_AND;
10991095
\$operator = (\$comparison === Criteria::CONTAINS_NONE) ? Criteria::NOT_LIKE : Criteria::LIKE;
1096+
1097+
\$this->combineFilters();
11001098
foreach (\$$variableName as \$value) {
11011099
\$this->addFilterWithConjunction(\$andOr, \$resolvedColumn, \"%| \$value |%\", \$operator);
11021100
}
1101+
\$this->endCombineFilters();
1102+
11031103
if (\$comparison == Criteria::CONTAINS_NONE) {
11041104
\$this->addOr(\$resolvedColumn, null, Criteria::ISNULL);
11051105
}

tests/Propel/Tests/Generator/Builder/Om/GeneratedQueryArrayColumnTypeTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,32 @@ public function testFilterBySingularColumnUsingContainsNone()
258258
$this->assertEquals([], $e[0]->getTags(), 'array columns are searchable by element using Criteria::CONTAINS_NONE');
259259
$this->assertEquals(['bar23'], $e[1]->getTags(), 'array columns are searchable by element using Criteria::CONTAINS_NONE');
260260
}
261+
262+
public function queryStructureDataProvider(): array
263+
{
264+
$t = 'complex_column_type_entity_11';
265+
$sf = "SELECT FROM $t WHERE $t.id=:p1";
266+
267+
return [
268+
[Criteria::CONTAINS_ALL, "$sf AND ($t.tags LIKE :p2 AND $t.tags LIKE :p3)"],
269+
[Criteria::CONTAINS_SOME, "$sf AND ($t.tags LIKE :p2 OR $t.tags LIKE :p3)"],
270+
[Criteria::CONTAINS_NONE, "$sf AND (($t.tags NOT LIKE :p2 AND $t.tags NOT LIKE :p3) OR $t.tags IS NULL )"],
271+
[null, "$sf AND ($t.tags LIKE :p2 AND $t.tags LIKE :p3)"],
272+
];
273+
}
274+
/**
275+
* @dataProvider queryStructureDataProvider
276+
*
277+
* @return void
278+
*/
279+
public function testQueryStructure(string|null $op, string $expected)
280+
{
281+
$p = [];
282+
$actually = ComplexColumnTypeEntity11Query::create()
283+
->filterById(1)
284+
->filterByTags(['a', 'b'], $op)
285+
->createSelectSql($p);
286+
287+
$this->assertEquals($expected, $actually);
288+
}
261289
}

0 commit comments

Comments
 (0)