Doctrine 2.0 vs 2.1 cascade删除OneToMany

时间:2011-10-14 11:33:58

标签: doctrine-orm

你好,我试图在OneToMany关系中级联删除实体时遇到问题。 经过几个小时的调试后,我试图将学说从最新的2.1.2降级到2.0.2,然后突然开始工作。

想象两个实体公司和地址关系1:N。

/**
 * @Entity
 */
class Company extends Entity
{

 /**
  * @var integer
  * @id @Column(type="integer")
  * @generatedValue
  */
 private $id;

 /**
  * @var Collection
  * @OneToMany(targetEntity="Address",mappedBy="company", cascade={"persist","remove"})
  */
 private $addresses;
}



/**
 * @Entity
 */
class Address extends Entity
{

 /**
  * @var integer
  * @id @Column(type="integer")
  * @generatedValue
  */
 private $id;

 /**
  * @var Company
  * @ManyToOne(targetEntity="Company", inversedBy="addresses")
  * @JoinColumn(name="company_id", referencedColumnName="id",nullable=false)
  */
 private $company;
}

当我尝试删除实体公司时,我希望删除分配的地址。

$em->remove($company);
$em->flush();

在学说2.1.2中,不执行地址删除,因此完整性约束失败。在2.0.2版本中,它完美运行。奇怪的是,如果我使用EntityAudit扩展https://github.com/simplethings/EntityAudit,LogRevisionListener会在doctrine 2.1.2(当然也在2.0.2中)对地址实体(设置它们的revtype = DEL)进行相应的版本控制,但是UnitOfWork是不要删除它。

如何处理2.0.2和2.1.2中的级联删除有什么区别?

非常感谢

3 个答案:

答案 0 :(得分:10)

尝试在addresses

Company属性上使用此功能
@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true)

答案 1 :(得分:3)

我遇到了同样的问题......关系被添加或更新,但未删除,即使我有级联:[persist,remove]。

我发现我不需要“cascade”中的“remove”属性,但我必须添加orphanRemoval:true。

我疯了,你结束了我的一天!

答案 2 :(得分:1)

我遇到了同样的问题,我用那个代码解决了他:

$em->remove($object);
$em->flush();
$em->remove($user);
$em->flush();

也许您可以在findAll上使用company作为地址,并使用foreach删除此地址:

// Return all the addresses of the company
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company);
$em->remove($company);
foreach ($address in $addresses)
{
    $em->remove($address);
}

这不是一个非常好的方法,但就目前而言,这就是我找到的所有方法。