【发布时间】:2015-06-25 17:05:17
【问题描述】:
假设我们有两个实体(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 的答案。
EDIT:添加 Doctrine 书
中的三个注释1.如果关联被标记为 CASCADE=REMOVE,则 Doctrine 2 将获取此关联。如果它是一个单一关联,它将把这个实体传递给
EntityManager#remove()。如果关联是一个集合,Doctrine 将遍历它的所有元素并将它们传递给EntityManager#remove()。在这两种情况下,级联删除语义都是递归应用的。对于大型对象图,这种删除策略可能非常昂贵。2.使用 DQL DELETE 语句,您可以使用单个命令删除一个类型的多个实体,而无需对这些实体进行水合。这对于从数据库中删除大型对象图非常有效。
3.使用外键语义 onDelete="CASCADE" 可以强制数据库在内部删除所有关联对象。这种策略要正确有点棘手,但可以非常强大和快速。 但是您应该知道,使用策略 1 (
CASCADE=REMOVE) 会完全绕过任何外键onDelete=CASCADE选项,因为 Doctrine 仍会显式获取并删除所有关联实体。
【问题讨论】:
标签: php symfony doctrine-orm doctrine