From 5799e391c6e14c651d756cfbf49cf51181934e78 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 15 Aug 2010 14:40:06 +0200 Subject: [PATCH] Fix bug with updating assoc-id entities --- .../ORM/Persisters/BasicEntityPersister.php | 13 +++-- .../ORM/Functional/Ticket/DDC117Test.php | 48 +++++++++++++++++-- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php index 8b0a38c4f..6ca95c0da 100644 --- a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php @@ -303,9 +303,16 @@ class BasicEntityPersister $where = array(); $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity); foreach ($this->_class->identifier as $idField) { - $where[] = $this->_class->getQuotedColumnName($idField, $this->_platform); - $params[] = $id[$idField]; - $types[] = $this->_class->fieldMappings[$idField]['type']; + if (isset($this->_class->associationMappings[$idField])) { + $targetMapping = $this->_em->getClassMetadata($this->_class->associationMappings[$idField]['targetEntity']); + $where[] = $this->_class->associationMappings[$idField]['joinColumns'][0]['name']; + $params[] = $id[$idField]; + $types[] = $targetMapping->fieldMappings[$targetMapping->identifier[0]]['type']; + } else { + $where[] = $this->_class->getQuotedColumnName($idField, $this->_platform); + $params[] = $id[$idField]; + $types[] = $this->_class->fieldMappings[$idField]['type']; + } } if ($versioned) { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php index 8bd456b35..20b14292b 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC117Test.php @@ -74,10 +74,19 @@ class DDC117Test extends \Doctrine\Tests\OrmFunctionalTestCase $dql = "SELECT r, s FROM ".__NAMESPACE__."\DDC117Reference r JOIN r.source s WHERE s.title = ?1"; $dqlRef = $this->_em->createQuery($dql)->setParameter(1, 'Foo')->getSingleResult(); - $this->assertType(__NAMESPACE__."\DDC117Reference", $mapRef); - $this->assertType(__NAMESPACE__."\DDC117Article", $mapRef->target()); - $this->assertType(__NAMESPACE__."\DDC117Article", $mapRef->source()); + $this->assertType(__NAMESPACE__."\DDC117Reference", $dqlRef); + $this->assertType(__NAMESPACE__."\DDC117Article", $dqlRef->target()); + $this->assertType(__NAMESPACE__."\DDC117Article", $dqlRef->source()); $this->assertSame($dqlRef, $this->_em->find(__NAMESPACE__."\DDC117Reference", $idCriteria)); + + $dqlRef->setDescription("New Description!!"); + $this->_em->flush(); + $this->_em->clear(); + + $dql = "SELECT r, s FROM ".__NAMESPACE__."\DDC117Reference r JOIN r.source s WHERE s.title = ?1"; + $dqlRef = $this->_em->createQuery($dql)->setParameter(1, 'Foo')->getSingleResult(); + + $this->assertEquals('New Description!!', $dqlRef->getDescription()); } /** @@ -187,6 +196,14 @@ class DDC117Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->articleDetails = new DDC117ArticleDetails($this->article1, "Very long text"); $this->_em->persist($this->articleDetails); $this->_em->flush(); + + $this->articleDetails->update("not so very long text!"); + $this->_em->flush(); + $this->_em->clear(); + + /* @var $article DDC117Article */ + $article = $this->_em->find(get_class($this->article1), $this->article1->id()); + $this->assertEquals('not so very long text!', $article->getText()); } } @@ -246,6 +263,11 @@ class DDC117Article { $this->translations[] = new DDC117Translation($this, $language, $title); } + + public function getText() + { + return $this->details->getText(); + } } /** @@ -266,8 +288,18 @@ class DDC117ArticleDetails $this->article = $article; $article->setDetails($this); + $this->update($text); + } + + public function update($text) + { $this->text = $text; } + + public function getText() + { + return $this->text; + } } /** @@ -315,6 +347,16 @@ class DDC117Reference { return $this->target; } + + public function setDescription($desc) + { + $this->description = $desc; + } + + public function getDescription() + { + return $this->description; + } } /**