diff --git a/lib/Doctrine/ORM/AbstractQuery.php b/lib/Doctrine/ORM/AbstractQuery.php index 0f0078a7e..6dda4d2f8 100644 --- a/lib/Doctrine/ORM/AbstractQuery.php +++ b/lib/Doctrine/ORM/AbstractQuery.php @@ -296,6 +296,7 @@ abstract class AbstractQuery */ public function setResultSetMapping(Query\ResultSetMapping $rsm) { + $rsm->translateNamespaces($this->_em); $this->_resultSetMapping = $rsm; return $this; diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index bc28aa072..04d741cbb 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -83,7 +83,7 @@ class ObjectHydrator extends AbstractHydrator */ private $existingCollections = array(); - /** + /** * {@inheritdoc} */ protected function prepare() @@ -525,7 +525,7 @@ class ObjectHydrator extends AbstractHydrator // check for existing result from the iterations before if ( ! isset($this->identifierMap[$dqlAlias][$id[$dqlAlias]])) { $element = $this->getEntity($rowData[$dqlAlias], $dqlAlias); - + if ($this->_rsm->isMixed) { $element = array($entityKey => $element); } @@ -597,7 +597,7 @@ class ObjectHydrator extends AbstractHydrator if ($count === 1) { $result[$resultKey] = $obj; - + continue; } diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index 9dbe9bc63..1461f4f4c 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -19,6 +19,8 @@ namespace Doctrine\ORM\Query; +use Doctrine\ORM\EntityManager; + /** * A ResultSetMapping describes how a result set of an SQL query maps to a Doctrine result. * @@ -543,4 +545,27 @@ class ResultSetMapping return $this; } + + /** + * Allows to translate entity namespaces to full qualified names. + * + * @param EntityManager $em + * + * @return void + */ + public function translateNamespaces(EntityManager $em) + { + $fqcn = array(); + + $translate = function (&$alias) use ($em, &$fqcn) { + if ( ! isset($fqcn[$alias])) { + $fqcn[$alias] = $em->getClassMetadata($alias)->getName(); + } + $alias = $fqcn[$alias]; + }; + + array_walk($this->aliasMap, $translate); + array_walk($this->declaringClasses, $translate); + } } + diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php new file mode 100644 index 000000000..949091f77 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php @@ -0,0 +1,115 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2256User'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2256Group') + )); + } + + public function testIssue() + { + $config = $this->_em->getConfiguration(); + $config->addEntityNamespace('MyNamespace', 'Doctrine\Tests\ORM\Functional\Ticket'); + + $user = new DDC2256User(); + $user->name = 'user'; + $group = new DDC2256Group(); + $group->name = 'group'; + $user->group = $group; + + $this->_em->persist($user); + $this->_em->persist($group); + $this->_em->flush(); + $this->_em->clear(); + + $sql = 'SELECT u.id, u.name, g.id as group_id, g.name as group_name FROM ddc2256_users u LEFT JOIN ddc2256_groups g ON u.group_id = g.id'; + + // Test ResultSetMapping. + $rsm = new ResultSetMapping(); + + $rsm->addEntityResult('MyNamespace:DDC2256User', 'u'); + $rsm->addFieldResult('u', 'id', 'id'); + $rsm->addFieldResult('u', 'name', 'name'); + + $rsm->addJoinedEntityResult('MyNamespace:DDC2256Group', 'g', 'u', 'group'); + $rsm->addFieldResult('g', 'group_id', 'id'); + $rsm->addFieldResult('g', 'group_name', 'name'); + + $this->_em->createNativeQuery($sql, $rsm)->getResult(); + + // Test ResultSetMappingBuilder. + $rsm = new ResultSetMappingBuilder($this->_em); + $rsm->addRootEntityFromClassMetadata('MyNamespace:DDC2256User', 'u'); + $rsm->addJoinedEntityFromClassMetadata('MyNamespace:DDC2256Group', 'g', 'u', 'group', array('id' => 'group_id', 'name' => 'group_name')); + + $this->_em->createNativeQuery($sql, $rsm)->getResult(); + } +} + +/** + * @Entity + * @Table(name="ddc2256_users") + */ +class DDC2256User +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @Column(type="string") + */ + public $name; + + /** + * @ManyToOne(targetEntity="DDC2256Group", inversedBy="users")A + * @JoinColumn(name="group_id") + */ + public $group; +} + +/** + * @Entity + * @Table(name="ddc2256_groups") + */ +class DDC2256Group +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @Column(type="string") + */ + public $name; + + /** + * @OneToMany(targetEntity="DDC2256User", mappedBy="group") + */ + public $users; + + public function __construct() + { + $this->users = new \Doctrine\Common\Collections\ArrayCollection(); + } +} +