实际上有两种方法可以实现您的目标。您可以使用 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();