1
0
mirror of synced 2025-01-17 22:11:41 +03:00

[DDC-531] Fixed.

This commit is contained in:
Roman S. Borschel 2010-05-21 11:49:05 +02:00
parent 35f66ab4ed
commit 616f2eda0a
2 changed files with 92 additions and 2 deletions

View File

@ -513,10 +513,12 @@ class BasicEntityPersister
$targetClass = $this->_em->getClassMetadata($assoc->targetEntityName);
if ($assoc->isOwningSide) {
$isInverseSingleValued = $assoc->inversedBy && ! $targetClass->isCollectionValuedAssociation($assoc->inversedBy);
// Mark inverse side as fetched in the hints, otherwise the UoW would
// try to load it in a separate query (remember: to-one inverse sides can not be lazy).
$hints = array();
if ($assoc->inversedBy) {
if ($isInverseSingleValued) {
$hints['fetched'][$targetClass->name][$assoc->inversedBy] = true;
if ($targetClass->subClasses) {
foreach ($targetClass->subClasses as $targetSubclassName) {
@ -533,7 +535,7 @@ class BasicEntityPersister
$targetEntity = $this->load($identifier, $targetEntity, $assoc, $hints);
// Complete bidirectional association, if necessary
if ($targetEntity !== null && $assoc->inversedBy && ! $targetClass->isCollectionValuedAssociation($assoc->inversedBy)) {
if ($targetEntity !== null && $isInverseSingleValued) {
$targetClass->reflFields[$assoc->inversedBy]->setValue($targetEntity, $sourceEntity);
}
} else {

View File

@ -0,0 +1,88 @@
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
require_once __DIR__ . '/../../../TestInit.php';
class DDC531Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
protected function setUp()
{
parent::setUp();
$this->_schemaTool->createSchema(array(
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC531Item'),
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC531SubItem'),
));
}
public function testIssue()
{
$item1 = new DDC531Item;
$item2 = new DDC531Item;
$item2->parent = $item1;
$item1->getChildren()->add($item2);
$this->_em->persist($item1);
$this->_em->persist($item2);
$this->_em->flush();
$this->_em->clear();
$item3 = $this->_em->find(__NAMESPACE__ . '\DDC531Item', $item2->id); // Load child item first (id 2)
// parent will already be loaded, cannot be lazy because it has mapped subclasses and we would not
// know which proxy type to put in.
$this->assertTrue($item3->parent instanceof DDC531Item);
$this->assertFalse($item3->parent instanceof \Doctrine\ORM\Proxy\Proxy);
$item4 = $this->_em->find(__NAMESPACE__ . '\DDC531Item', $item1->id); // Load parent item (id 1)
$this->assertNull($item4->parent);
$this->assertNotNull($item4->getChildren());
$this->assertTrue($item4->getChildren()->contains($item3)); // lazy-loads children
}
}
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="type", type="integer")
* @DiscriminatorMap({"0" = "DDC531Item", "1" = "DDC531SubItem"})
*/
class DDC531Item
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @OneToMany(targetEntity="DDC531Item", mappedBy="parent")
*/
protected $children;
/**
* @ManyToOne(targetEntity="DDC531Item", inversedBy="children")
* @JoinColumn(name="parentId", referencedColumnName="id")
*/
public $parent;
public function __construct()
{
$this->children = new \Doctrine\Common\Collections\ArrayCollection;
}
public function getParent()
{
return $this->parent;
}
public function getChildren()
{
return $this->children;
}
}
/**
* @Entity
*/
class DDC531SubItem extends DDC531Item
{
}