如何在拆除时设置Cascade?

时间:2013-05-24 13:38:47

标签: symfony doctrine-orm

我在删除某些对象时遇到了一些问题,因为这些对象有其他与之相关的对象。

例如。我有一个名为Home的实体。此实体包含namedescription等字段,以及id

然后,我有一个名为Citizen的实体,其中包含namesurnamehome。最后一个字段与Home直接相关。

因此,如果我尝试删除HOME对象,它会崩溃,因为有一些外键与此对象相关。我现在正在做的是搜索公民,并删除它们,但这不是实现这一目标的最佳方法。

我知道有一个类似“CASCADE”的注释,但我不知道在哪里放置这个注释。

我应该在哪里设置此注释以实现我想要做的事情?

感谢。

2 个答案:

答案 0 :(得分:3)

在您的家庭实体中,您应该拥有包含所有公民的字段。

    /**
     *
     * @OneToMany(targetEntity="Citizen", mappedBy="home", cascade={"remove"})
     */
     protected $citizens;

答案 1 :(得分:2)

实际上有两种实现目标的方法。您可以使用ORM级别和数据库级别级联。

ORM等级

// Home Entity

/**
 * @comment The owning side has to use the inversedBy attribute of ManyToOne
 * 
 * @ManyToOne(targetEntity="Citizen", inversedBy="home", cascade={"remove"})
 */
 protected $citizens;

 // ...

数据库级

// Home Entity

/**
 * onDelete="CASCADE" is used on the joinColumn 
 * It will add On Delete Cascade to the foreign key column in the database.
 * 
 * @ManyToOne(targetEntity="Citizen", inversedBy="home", cascade={"remove"})
 * @ORM\JoinColumn(name="citizen_id", referencedColumnName="id", onDelete="CASCADE")
 */
 protected $citizens;

 // ...

<强>注意

在设置级联选项时必须小心。

您很可能不希望教条删除您关系的拥有方(在这种情况下,如果您删除公民,则删除主页 - 因此仅将其设置在您的Home实体上)。

Alesh的例子在你的用例中是错误的,因为mappedBy总是与关系的反面!

在您的情况下,Home将成为拥有者,因为一个Home将拥有多个Citizens。 现在,如果你删除Home,你希望你的公民无家可归(也就是被删除)。

Doctrine也只跟踪变更关系的拥有方,现在如果您将一个公民添加到集合中(例如,使用集合表单类型)...

$home->addCitizen($citizen);

...您可能希望在致电

时自动保留您的公民(使用级联持久设置)
$em->flush();