Skip to content

Commit

Permalink
Merge pull request #11456 from prohalexey/IntegerDescriminatorInInsta…
Browse files Browse the repository at this point in the history
…nceOf

Using an integer as discriminator value with ORM v3
  • Loading branch information
greg0ire committed May 17, 2024
2 parents 3d9af31 + 2b04cc2 commit daa99f1
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/Query/SqlWalker.php
Original file line number Diff line number Diff line change
Expand Up @@ -2251,8 +2251,10 @@ private function getChildDiscriminatorsFromClassMetadata(
$discriminators += HierarchyDiscriminatorResolver::resolveDiscriminatorsForClass($metadata, $this->em);
}

foreach (array_keys($discriminators) as $dis) {
$sqlParameterList[] = $this->conn->quote($dis);
foreach (array_keys($discriminators) as $discriminatorValue) {
$sqlParameterList[] = $rootClass->getDiscriminatorColumn()->type === 'integer' && is_int($discriminatorValue)
? $discriminatorValue
: $this->conn->quote((string) $discriminatorValue);
}

return '(' . implode(', ', $sqlParameterList) . ')';
Expand Down
26 changes: 26 additions & 0 deletions tests/Tests/ORM/Functional/Ticket/GH11341Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,32 @@ public function testDiscriminatorValue(string $dql, string $expectedDiscriminato

self::assertMatchesRegularExpression($expectedDiscriminatorValues, $sql);
}

public static function dqlStatementsForInstanceOf(): Generator
{
yield [IntegerBaseClass::class, IntegerFooEntity::class];
yield [StringBaseClass::class, StringFooEntity::class];
yield [StringAsIntBaseClass::class, StringAsIntFooEntity::class];
}

/**
* @psalm-param class-string $baseClass
* @psalm-param class-string $inheritedClass
*/
#[DataProvider('dqlStatementsForInstanceOf')]
public function testInstanceOf(string $baseClass, string $inheritedClass): void
{
$this->_em->persist(new $inheritedClass());
$this->_em->flush();

$dql = 'SELECT p FROM ' . $baseClass . ' p WHERE p INSTANCE OF ' . $baseClass;

$query = $this->_em->createQuery($dql);
$result = $query->getResult();

self::assertCount(1, $result);
self::assertContainsOnlyInstancesOf($baseClass, $result);
}
}

#[ORM\Entity]
Expand Down

0 comments on commit daa99f1

Please sign in to comment.