1
0
mirror of synced 2025-01-31 04:21:44 +03:00

[DDC-812] Fix uninitialized collections of managed entities not being initialized on subsequent fetch-join.

This commit is contained in:
Roman S. Borschel 2010-10-31 11:07:26 +01:00
parent 9211bc2f4e
commit 4f71c3e6a3
2 changed files with 56 additions and 6 deletions

View File

@ -161,14 +161,16 @@ class ObjectHydrator extends AbstractHydrator
$class->reflFields[$fieldName]->setValue($entity, $value);
$this->_uow->setOriginalEntityProperty($oid, $fieldName, $value);
$this->_initializedCollections[$oid . $fieldName] = $value;
} else if (isset($this->_hints[Query::HINT_REFRESH])) {
// Is already PersistentCollection, but REFRESH
} else if (isset($this->_hints[Query::HINT_REFRESH]) ||
isset($this->_hints['fetched'][$class->name][$fieldName]) &&
! $value->isInitialized()) {
// Is already PersistentCollection, but either REFRESH or FETCH-JOIN and UNINITIALIZED!
$value->setDirty(false);
$value->setInitialized(true);
$value->unwrap()->clear();
$this->_initializedCollections[$oid . $fieldName] = $value;
} else {
// Is already PersistentCollection, and DONT REFRESH
// Is already PersistentCollection, and DON'T REFRESH or FETCH-JOIN!
$this->_existingCollections[$oid . $fieldName] = $value;
}

View File

@ -0,0 +1,48 @@
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\Tests\Models\CMS\CmsArticle;
use Doctrine\Tests\Models\CMS\CmsComment;
require_once __DIR__ . '/../../../TestInit.php';
class DDC812Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
protected function setUp()
{
$this->useModelSet('cms');
parent::setUp();
}
/**
* @group DDC-812
*/
public function testFetchJoinInitializesPreviouslyUninitializedCollectionOfManagedEntity()
{
//$this->_em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger);
$article = new CmsArticle;
$article->topic = "hello";
$article->text = "talk talk talk";
$comment = new CmsComment;
$comment->topic = "good!";
$comment->text = "stuff!";
$comment->article = $article;
$this->_em->persist($article);
$this->_em->persist($comment);
$this->_em->flush();
$this->_em->clear();
$article2 = $this->_em->find(get_class($article), $article->id);
$article2Again = $this->_em->createQuery(
"select a, c from Doctrine\Tests\Models\CMS\CmsArticle a join a.comments c where a.id = ?1")
->setParameter(1, $article->id)
->getSingleResult();
$this->assertTrue($article2Again === $article2);
$this->assertTrue($article2Again->comments->isInitialized());
}
}