From 638c3df3a6fb648397d7b2bf3329c31d99cd401c Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Thu, 30 Sep 2010 21:59:01 +0200 Subject: [PATCH] DDC-822 - Fix making queries with detached entities --- lib/Doctrine/ORM/Query.php | 10 +++++-- .../ORM/Functional/DetachedEntityTest.php | 29 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/Doctrine/ORM/Query.php b/lib/Doctrine/ORM/Query.php index f8338267b..57aacf77c 100644 --- a/lib/Doctrine/ORM/Query.php +++ b/lib/Doctrine/ORM/Query.php @@ -242,10 +242,14 @@ final class Query extends AbstractQuery } if (is_object($value) && $this->_em->getMetadataFactory()->hasMetadataFor(get_class($value))) { - //TODO: Check that $value is MANAGED? - $values = $this->_em->getUnitOfWork()->getEntityIdentifier($value); + if ($this->_em->getUnitOfWork()->getEntityState($value) == UnitOfWork::STATE_MANAGED) { + $idValues = $this->_em->getUnitOfWork()->getEntityIdentifier($value); + } else { + $class = $this->_em->getClassMetadata(get_class($value)); + $idValuess = $class->getIdentifierValues($value); + } $sqlPositions = $paramMappings[$key]; - $sqlParams += array_combine((array)$sqlPositions, $values); + $sqlParams += array_combine((array)$sqlPositions, $idValues); } else { foreach ($paramMappings[$key] as $position) { $sqlParams[$position] = $value; diff --git a/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php b/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php index eee01fadf..16f3ce602 100644 --- a/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/DetachedEntityTest.php @@ -105,8 +105,8 @@ class DetachedEntityTest extends \Doctrine\Tests\OrmFunctionalTestCase } catch (\Exception $expected) {} } - public function testUninitializedLazyAssociationsAreIgnoredOnMerge() { - //$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger); + public function testUninitializedLazyAssociationsAreIgnoredOnMerge() + { $user = new CmsUser; $user->name = 'Guilherme'; $user->username = 'gblanco'; @@ -136,5 +136,30 @@ class DetachedEntityTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertFalse($managedAddress2->user === $detachedAddress2->user); $this->assertFalse($managedAddress2->user->__isInitialized__); } + + /** + * @group DDC-822 + */ + public function testUseDetachedEntityAsQueryParameter() + { + $user = new CmsUser; + $user->name = 'Guilherme'; + $user->username = 'gblanco'; + $user->status = 'developer'; + + $this->_em->persist($user); + + $this->_em->flush(); + $this->_em->detach($user); + + $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = ?1"; + $query = $this->_em->createQuery($dql); + $query->setParameter(1, $user); + + $newUser = $query->getSingleResult(); + + $this->assertType('Doctrine\Tests\Models\CMS\CmsUser', $newUser); + $this->assertEquals('gblanco', $newUser->username); + } }