1

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

例如。我有一个名为Home. 这个实体有一些字段,比如nameand description, aswel as id

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

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

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

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

谢谢。

4

2 回答 2

3

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

    /**
     *
     * @OneToMany(targetEntity="Citizen", mappedBy="home", cascade={"remove"})
     */
     protected $citizens;
于 2013-05-24T13:48:06.250 回答
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 - 因此仅将其设置在您的 Home 实体上)。

Alesh 的示例在您的用例中是错误的,因为 mappedBy 始终是关系的反面!

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

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

$home->addCitizen($citizen);

...您可能希望您的公民在调用时自动持久化(使用级联持久集)

$em->flush();
于 2013-05-24T14:16:26.390 回答