了解Doctrine级联操作

时间:2014-07-07 14:12:13

标签: 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;

1 个答案:

答案 0 :(得分:133)

坚持&删除

你对cascade={"persist"}的说法是正确的,这意味着持久化的实体A,Doctrine也会在集合中保留所有B实体。

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

分离&合并

cascade={"detach"}cascade={"merge"}

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

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

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

合并 detach 相反:您将分离的实体合并回EntityManager。
请注意merge()实际上将返回托管对象,您传递给它的分离对象仍然不受管理。