From 7aa1c0a9078e33b201200acb024463cf611ec9b2 Mon Sep 17 00:00:00 2001 From: Ulf Date: Tue, 17 Jun 2014 14:45:59 +0200 Subject: [PATCH 1/2] Create DDC3170Test.php Added test for [DDC-3170] (http://www.doctrine-project.org/jira/browse/DDC-3170) --- .../ORM/Functional/Ticket/DDC3170Test.php | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php new file mode 100644 index 000000000..591b0fd71 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3170Test.php @@ -0,0 +1,110 @@ +_schemaTool->createSchema( + array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170AbstractEntityJoined'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170ProductJoined'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170AbstractEntitySingleTable'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC3170ProductSingleTable'), + ) + ); + } + + /** + * Tests that the discriminator column is correctly read from the meta mappings when fetching a + * child from an inheritance mapped class. + * + * The simple object hydration maps the type field to a field alias like type2. This mapping needs + * to be considered when loading the discriminator column's value from the SQL result. + * + * {@see \Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator::hydrateRowData()} + */ + public function testIssue() + { + // $this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); + + $productJoined = new DDC3170ProductJoined(); + $productSingleTable = new DDC3170ProductSingleTable(); + $this->_em->persist($productJoined); + $this->_em->persist($productSingleTable); + $this->_em->flush(); + $this->_em->clear(); + + try { + $this->_em->createQueryBuilder() + ->select('p') + ->from(__NAMESPACE__ . '\\DDC3170ProductJoined', 'p') + ->getQuery() + ->getResult(AbstractQuery::HYDRATE_SIMPLEOBJECT); + } catch (HydrationException $e) // Thrown by SimpleObjectHydrator + { + $this->fail('Failed correct mapping of discriminator column when using simple object hydration and class table inheritance'); + } + + try { + $this->_em->createQueryBuilder() + ->select('p') + ->from(__NAMESPACE__ . '\\DDC3170ProductSingleTable', 'p') + ->getQuery() + ->getResult(AbstractQuery::HYDRATE_SIMPLEOBJECT); + } catch (HydrationException $e) // Thrown by SimpleObjectHydrator + { + $this->fail('Failed correct mapping of discriminator column when using simple object hydration and single table inheritance'); + } + } +} + +/** + * @Entity + * @InheritanceType("JOINED") + * @DiscriminatorColumn(name="type", type="string") + * @DiscriminatorMap({"product" = "DDC3170ProductJoined"}) + */ +abstract class DDC3170AbstractEntityJoined +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; +} + +/** + * @Entity + */ +class DDC3170ProductJoined extends DDC3170AbstractEntityJoined +{ +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorColumn(name="type", type="string") + * @DiscriminatorMap({"product" = "DDC3170ProductSingleTable"}) + */ +abstract class DDC3170AbstractEntitySingleTable +{ + /** @Id @Column(type="integer") @GeneratedValue */ + public $id; +} + +/** + * @Entity + */ +class DDC3170ProductSingleTable extends DDC3170AbstractEntitySingleTable +{ +} From a7aa6342471d339930e66c374888cf93b823acf8 Mon Sep 17 00:00:00 2001 From: Ulf Date: Tue, 17 Jun 2014 14:51:19 +0200 Subject: [PATCH 2/2] Fixed mapping of discriminator column Added fix for [DDC-3170] (http://www.doctrine-project.org/jira/browse/DDC-3170). When querying a simple entity which uses single table- or class table inheritance using simple object hydration (``AbstractQuery::HYDRATE_SIMPLEOBJECT``), the mapped discriminator column was not retrieved correctly. If the column got an alias during result set mapping other than it's actual name (e.g. ``type34`` insteaad of ``type``) than this alias wasn't reverted when retrieving the discriminator column from the SQL result set. --- lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php index 124b099c7..ea2664291 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php @@ -75,6 +75,11 @@ class SimpleObjectHydrator extends AbstractHydrator if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { $discrColumnName = $this->_platform->getSQLResultCasing($this->class->discriminatorColumn['name']); + // Find mapped discriminator column from the result set. + if ($metaMappingDiscrColumnName = array_search($discrColumnName, $this->_rsm->metaMappings)) { + $discrColumnName = $metaMappingDiscrColumnName; + } + if ( ! isset($sqlResult[$discrColumnName])) { throw HydrationException::missingDiscriminatorColumn($entityName, $discrColumnName, key($this->_rsm->aliasMap)); }