diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 356ea02b2..9f54463c1 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -1401,6 +1401,10 @@ class UnitOfWork implements PropertyChangedListener return self::STATE_NEW; } + if ($class->containsForeignIdentifier) { + $id = $this->flattenIdentifier($class, $id); + } + switch (true) { case ($class->isIdentifierNatural()); // Check for a version field, if available, to avoid a db lookup. @@ -1725,6 +1729,29 @@ class UnitOfWork implements PropertyChangedListener return $this->doMerge($entity, $visited); } + /** + * convert foreign identifiers into scalar foreign key values to avoid object to string conversion failures. + * + * @param ClassMetadata $class + * @param array $id + * @return array + */ + private function flattenIdentifier($class, $id) + { + $flatId = array(); + + foreach ($id as $idField => $idValue) { + if (isset($class->associationMappings[$idField])) { + $targetClassMetadata = $this->em->getClassMetadata($class->associationMappings[$idField]['targetEntity']); + $associatedId = $this->getEntityIdentifier($idValue); + + $flatId[$idField] = $associatedId[$targetClassMetadata->identifier[0]]; + } + } + + return $flatId; + } + /** * Executes a merge operation on an entity. * @@ -1772,19 +1799,9 @@ class UnitOfWork implements PropertyChangedListener $this->persistNew($class, $managedCopy); } else { - $flatId = $id; - if ($class->containsForeignIdentifier) { - // convert foreign identifiers into scalar foreign key - // values to avoid object to string conversion failures. - foreach ($id as $idField => $idValue) { - if (isset($class->associationMappings[$idField])) { - $targetClassMetadata = $this->em->getClassMetadata($class->associationMappings[$idField]['targetEntity']); - $associatedId = $this->getEntityIdentifier($idValue); - - $flatId[$idField] = $associatedId[$targetClassMetadata->identifier[0]]; - } - } - } + $flatId = ($class->containsForeignIdentifier) + ? $this->flattenIdentifier($class, $id) + : $id; $managedCopy = $this->tryGetById($flatId, $class->rootEntityName); diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php index 6ae4595dc..bf2ef0b27 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php @@ -461,4 +461,22 @@ class DDC117Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertEquals($before + 3, count($data)); } + + /** + * @group DDC-2246 + */ + public function testGetEntityState() + { + $this->article1 = $this->_em->find("Doctrine\Tests\Models\DDC117\DDC117Article", $this->article1->id()); + $this->article2 = $this->_em->find("Doctrine\Tests\Models\DDC117\DDC117Article", $this->article2->id()); + + $this->reference = new DDC117Reference($this->article2, $this->article1, "Test-Description"); + + $this->assertEquals(\Doctrine\ORM\UnitOfWork::STATE_NEW, $this->_em->getUnitOfWork()->getEntityState($this->reference)); + + $idCriteria = array('source' => $this->article1->id(), 'target' => $this->article2->id()); + $reference = $this->_em->find("Doctrine\Tests\Models\DDC117\DDC117Reference", $idCriteria); + + $this->assertEquals(\Doctrine\ORM\UnitOfWork::STATE_MANAGED, $this->_em->getUnitOfWork()->getEntityState($reference)); + } }