我在删除某些对象时遇到了一些问题,因为这些对象有其他与之相关的对象。
例如。我有一个名为Home
的实体。此实体包含name
和description
等字段,以及id
。
然后,我有一个名为Citizen
的实体,其中包含name
,surname
,home
。最后一个字段与Home直接相关。
因此,如果我尝试删除HOME对象,它会崩溃,因为有一些外键与此对象相关。我现在正在做的是搜索公民,并删除它们,但这不是实现这一目标的最佳方法。
我知道有一个类似“CASCADE”的注释,但我不知道在哪里放置这个注释。
我应该在哪里设置此注释以实现我想要做的事情?
感谢。
答案 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();