orphanRemoval是否绕过了删除?
假设我们有两个实体( Profile和Address )。 配置文件可以有很多地址。 在这种情况下,我们有:
Profile:
...
fields:
...
oneToMany:
addresses:
targetEntity: Address
mappedBy: profile
orphanRemoval: true
Address:
...
fields:
...
manyToOne:
profile:
targetEntity: Profile
inversedBy: addresses
joinColumn:
name: profile_id
referencedColumnName: id
onDelete: cascade
现在,如果我删除了一个包含多个地址的配置文件:
$em->remove($profile);
地址如何被删除?
Doctrine是否获取与此配置文件相关的所有地址,然后将其删除或仅删除配置文件并让数据库处理地址?
我发现了几个有关Hibernate的答案,但没有提到Doctrine 。
编辑 :从教义书中添加三个注释
1.如果关联标记为CASCADE = REMOVE,则Doctrine 2将获取此关联。 如果它的Single关联,它会将这个实体传递给EntityManager#remove() 。 如果关联是一个集合,则Doctrine将循环其所有元素,并将它们传递给EntityManager#remove() 。 在这两种情况下,递归移除应用级联删除语义。 对于大型对象图,此删除策略可能非常昂贵。
2.使用DQL DELETE语句,您可以使用单个命令删除多个实体的类型,而无需为这些实体提供保湿功能。 这可以非常有效地从数据库中删除大型对象图。
3.使用外键语义onDelete =“CASCADE”可强制数据库在内部删除所有关联的对象。 这个策略有点棘手,但可以非常强大和快速。 你应该知道但是,使用策略1( CASCADE=REMOVE )完全绕过任何外键onDelete=CASCADE选项 ,因为教义将获取并删除所有相关实体明确不过。
我做了一个测试:
我首先获取Profile (只有profile没有连接)并将其传递给$em->remove($profile) ,然后教条运行另一个查询,获取与Profile相关的所有Address (一个查询),之后, 教条运行一个删除查询与Profile相关的每个地址 ,并在最后删除Profile 。
所以,我可以说, orphanRemoval是另一种级联 ,就像学说说的那样:
orphanRemoval :还有另一个层叠概念,只有在从集合中移除实体时才是相关的
和orphanRemoval绕过onDelete 。
“学说”手册中有关于孤儿删除的章节。 另外还有一个关于onDelete: cascade问题onDelete: cascade 。 我希望这两个链接可以帮助你进一步理解这个话题。
另外,确保在$em->remove($profile); 你调用$em->flush(); 操作将本地工作单元同步到数据库。
