php - 了解 Doctrine 级联操作

标签 php doctrine cascade

我想检查我对 Doctrine 关联的级联操作的理解。对于这个问题,我有两个模型:CustomerInsuree

如果我定义 CustomerInsuree 之间的多对多关系并设置 cascade{"all"},我明白这将:

  • 向客户添加新的被保险人将保留该被保险人并在连接表中创建关联。
  • 从集合中删除被保险人将使被保险人与客户分离,并将客户与被保险人分离。
  • 删除客户将删除与该客户关联的所有被保险人。

这是Customers上关联的定义。

/**
 * @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"})
 * @ORM\JoinTable(name="customer_insuree",
 *      joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")}
 * )
 */
protected $insurees;

如果我定义 InsureeCustomer 之间的反向多对多关系并设置 cascade{"all"},我明白这将:

  • 向被保险人添加新客户将保留该客户并在连接表中创建关联。
  • 从集合中删除客户将使客户与被保险人分离,并将被保险人与客户分离。
  • 删除被保险人将删除与其关联的所有客户。

这是Insurees上关联的定义。

/**
 * @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"})
 */
protected $customers;

如果我随后将关系定义为在持久化、合并和分离上级联 - 删除被保险人不会删除所有关联的客户 - 它只会删除被保险人与其客户之间的关联?

/**
 * @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"})
 */
protected $customers;

最佳答案

保留并删除

您对 cascade={"persist"} 的理解是正确的,这意味着持久化实体 A,Doctrine 也将持久化集合中的所有 B 实体。

您对 cascade={"remove"} 的理解也是正确的,这意味着删除实体 A,Doctrine 也会删除集合中的所有 B 实体。
但我怀疑您是否希望在多对多关联上使用它,因为当您删除将此操作级联到所有 B 实体的实体 A 时,这些 B 实体可能会与其他 A 实体相关联。

分离和合并

关于 cascade={"detach"}cascade={"merge"},您正确:

从集合中添加/删除实体是需要做的事情(在您的代码中)。阅读 here .

Detach 表示您从 EntityManager 中分离实体。 EntityManager 将不再管理该实体。这使得分离的实体与新实例化的实体相同,只是它已经在数据库中(但您让 EntityManager 不知道这一点)。

换句话说:cascade={"detach"}表示分离实体A,Doctrine也会分离Collection中的所有B实体。

Mergedetach 是相反的:您将分离的实体合并回 EntityManager。
请注意 merge() 实际上会返回一个 new 托管对象,您传递给它的分离对象仍然是非托管对象。

关于php - 了解 Doctrine 级联操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24612664/

相关文章:

php - MySQL LIKE 查询不提取相似数据

php - 如何在 Doctrine 的 Mongodb ODM 中使用正则表达式?

database - symfony2 Doctrine 表锁

cocoa - 如何正确级联删除Core Data中的托管对象?

sql-server-2008 - 级联删除和更新的优点和缺点是什么?

php - 如果在 WooCommerce 中选中结账自定义复选框,请更改用户角色

php - Facebook 注册和登录 Slim Framework PHP API

symfony - Doctrine :mapping:convert and doctrine:mapping:import之间的区别

java - Hibernate HQL批量删除不删除连接表值

php 只能从文档根目录工作?