diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 7490e3e4f..dda16b0b6 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -294,17 +294,20 @@ abstract class AbstractHydrator $dqlAlias = $cacheKeyInfo['dqlAlias']; $type = $cacheKeyInfo['type']; - var_dump($dqlAlias); - var_dump($cacheKeyInfo); - echo "\n\n\n"; - + if( + isset($cacheKeyInfo['discriminatorColumn']) && + isset($data[$cacheKeyInfo['discriminatorColumn']]) && + $data[$cacheKeyInfo['discriminatorColumn']] != $cacheKeyInfo['discriminatorValue'] + ){ + break; + } // in an inheritance hierarchy the same field could be defined several times. // We overwrite this value so long we don't have a non-null value, that value we keep. // Per definition it cannot be that a field is defined several times and has several values. - if (!empty($rowData['data'][$dqlAlias][$fieldName])) { + if (isset($rowData['data'][$dqlAlias][$fieldName])) { break; } - + $rowData['data'][$dqlAlias][$fieldName] = $type ? $type->convertToPHPValue($value, $this->_platform) : $value; @@ -379,13 +382,23 @@ abstract class AbstractHydrator $classMetadata = $this->getClassMetadata($this->_rsm->declaringClasses[$key]); $fieldName = $this->_rsm->fieldMappings[$key]; $fieldMapping = $classMetadata->fieldMappings[$fieldName]; + $ownerMap = $this->_rsm->columnOwnerMap[$key]; - return $this->_cache[$key] = [ - 'isIdentifier' => in_array($fieldName, $classMetadata->identifier), - 'fieldName' => $fieldName, - 'type' => Type::getType($fieldMapping['type']), - 'dqlAlias' => $this->_rsm->columnOwnerMap[$key], + $returnArray = [ + 'isIdentifier' => in_array($fieldName, $classMetadata->identifier), + 'fieldName' => $fieldName, + 'type' => Type::getType($fieldMapping['type']), + 'dqlAlias' => $ownerMap, + ]; + if( !empty($classMetadata->parentClasses)){ + $returnArray += [ + 'discriminatorColumn' => $this->_rsm->discriminatorColumns[$ownerMap], + 'discriminatorValue' => $classMetadata->discriminatorValue + ]; + } + + return $this->_cache[$key] = $returnArray; case (isset($this->_rsm->newObjectMappings[$key])): // WARNING: A NEW object is also a scalar, so it must be declared before! diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6303Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6303Test.php index d967b3b7f..a065e1d96 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6303Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6303Test.php @@ -38,19 +38,18 @@ class DDC6303Test extends \Doctrine\Tests\OrmFunctionalTestCase $repository = $this->_em->getRepository(DDC6303Contract::class); + $dataMap = [ + $contractA->id => $contractAData, + $contractB->id => $contractBData + ]; + $contracts = $repository->createQueryBuilder('p') - ->getQuery()->getResult(); + ->where('p.id IN(:ids)') + ->setParameter('ids', array_keys($dataMap)) + ->getQuery()->getResult(); foreach( $contracts as $contract ){ - switch( $contract->id ){ - case $contractA->id: - static::assertEquals($contract->originalData, $contractAData); - break; - - case $contractB->id: - static::assertEquals($contract->originalData, $contractBData); - break; - } + static::assertEquals($contract->originalData, $dataMap[$contract->id], 'contract ' . get_class($contract) . ' not equals to original'); } } @@ -92,8 +91,6 @@ class DDC6303Test extends \Doctrine\Tests\OrmFunctionalTestCase ->setParameter('ids', array_keys($dataMap)) ->getQuery()->getResult(); - - foreach( $contracts as $contract ){ static::assertEquals($contract->originalData, $dataMap[$contract->id], 'contract ' . get_class($contract) . ' not equals to original'); }