[DDC-599] Fixed.
This commit is contained in:
parent
4a9369de9e
commit
37b4652639
@ -832,6 +832,17 @@ class UnitOfWork implements PropertyChangedListener
|
|||||||
$calc->addClass($targetClass);
|
$calc->addClass($targetClass);
|
||||||
}
|
}
|
||||||
$calc->addDependency($targetClass, $class);
|
$calc->addDependency($targetClass, $class);
|
||||||
|
// If the target class has mapped subclasses,
|
||||||
|
// these share the same dependency.
|
||||||
|
if ($targetClass->subClasses) {
|
||||||
|
foreach ($targetClass->subClasses as $subClassName) {
|
||||||
|
$targetSubClass = $this->_em->getClassMetadata($subClassName);
|
||||||
|
if ( ! $calc->hasClass($subClassName)) {
|
||||||
|
$calc->addClass($targetSubClass);
|
||||||
|
}
|
||||||
|
$calc->addDependency($targetSubClass, $class);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
131
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC599Test.php
Normal file
131
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC599Test.php
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
<?php
|
||||||
|
namespace Doctrine\Tests\ORM\Functional\Ticket;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../TestInit.php';
|
||||||
|
|
||||||
|
class DDC599Test extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||||
|
{
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
try {
|
||||||
|
$this->_schemaTool->createSchema(array(
|
||||||
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Subitem'),
|
||||||
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Item'),
|
||||||
|
$this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Child'),
|
||||||
|
));
|
||||||
|
} catch (\Exception $ignored) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCascadeRemoveOnInheritanceHierachy()
|
||||||
|
{
|
||||||
|
$item = new DDC599Subitem;
|
||||||
|
$item->elem = "foo";
|
||||||
|
$child = new DDC599Child;
|
||||||
|
$child->parent = $item;
|
||||||
|
$item->getChildren()->add($child);
|
||||||
|
$this->_em->persist($item);
|
||||||
|
$this->_em->persist($child);
|
||||||
|
$this->_em->flush();
|
||||||
|
$this->_em->clear();
|
||||||
|
|
||||||
|
$item = $this->_em->find(__NAMESPACE__ . '\DDC599Item', $item->id);
|
||||||
|
|
||||||
|
$this->_em->remove($item);
|
||||||
|
$this->_em->flush(); // Should not fail
|
||||||
|
|
||||||
|
$this->assertFalse($this->_em->contains($item));
|
||||||
|
$children = $item->getChildren();
|
||||||
|
$this->assertFalse($this->_em->contains($children[0]));
|
||||||
|
|
||||||
|
$this->_em->clear();
|
||||||
|
|
||||||
|
|
||||||
|
$item2 = new DDC599Subitem;
|
||||||
|
$item2->elem = "bar";
|
||||||
|
$this->_em->persist($item2);
|
||||||
|
$this->_em->flush();
|
||||||
|
|
||||||
|
$child2 = new DDC599Child;
|
||||||
|
$child2->parent = $item2;
|
||||||
|
$item2->getChildren()->add($child2);
|
||||||
|
$this->_em->persist($child2);
|
||||||
|
$this->_em->flush();
|
||||||
|
|
||||||
|
$this->_em->remove($item2);
|
||||||
|
$this->_em->flush(); // should not fail
|
||||||
|
|
||||||
|
$this->assertFalse($this->_em->contains($item));
|
||||||
|
$children = $item->getChildren();
|
||||||
|
$this->assertFalse($this->_em->contains($children[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCascadeRemoveOnChildren()
|
||||||
|
{
|
||||||
|
$class = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC599Subitem');
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('children', $class->associationMappings);
|
||||||
|
$this->assertTrue($class->associationMappings['children']->isCascadeRemove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Entity
|
||||||
|
* @InheritanceType("SINGLE_TABLE")
|
||||||
|
* @DiscriminatorColumn(name="type", type="integer")
|
||||||
|
* @DiscriminatorMap({"0" = "DDC599Item", "1" = "DDC599Subitem"})
|
||||||
|
*/
|
||||||
|
class DDC599Item
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Id
|
||||||
|
* @Column(type="integer")
|
||||||
|
* @GeneratedValue(strategy="AUTO")
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @OneToMany(targetEntity="DDC599Child", mappedBy="parent", cascade={"remove"})
|
||||||
|
*/
|
||||||
|
protected $children;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->children = new \Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChildren()
|
||||||
|
{
|
||||||
|
return $this->children;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Entity
|
||||||
|
*/
|
||||||
|
class DDC599Subitem extends DDC599Item
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Column(type="string")
|
||||||
|
*/
|
||||||
|
public $elem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Entity
|
||||||
|
*/
|
||||||
|
class DDC599Child
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Id
|
||||||
|
* @Column(type="integer")
|
||||||
|
* @GeneratedValue(strategy="AUTO")
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ManyToOne(targetEntity="DDC599Item", inversedBy="children")
|
||||||
|
* @JoinColumn(name="parentId", referencedColumnName="id")
|
||||||
|
*/
|
||||||
|
public $parent;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user