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();
操作将本地工作单元同步到数据库。