了解Doctrine级联操作

61 php doctrine cascade

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

如果我定义了一个许多人之间一对多的关系Customer,并Insuree与集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;
Run Code Online (Sandbox Code Playgroud)

如果我定义了逆许多人的之间有很多关系Insuree,并Customer与集cascade{"all"},我明白,这将:

  • 向受保人添加新客户将持续存在此客户并在联接表中创建关联.
  • 从集合中移除客户将使客户与保险公司分离,并将保险公司与客户分离.
  • 删除受保人将删除与其相关的所有客户.

这是关联的定义Insurees.

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

如果我然后定义关于级联保持,合并和分离的关系 - 删除保险人将不会删除所有相关客户 - 它只会删除保险公司与其客户之间的关联?

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

Jas*_*wer 140

坚持和删除

关于cascade={"persist"}持久化实体A,Doctrine还将保留Collection中所有B实体的含义是正确的.

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

分离和合并

正确cascade={"detach"}cascade={"merge"}:

在集合中添加/删除实体是需要做的(在您的代码中).在这里阅读.

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

换句话说:cascade={"detach"}意味着分离实体A,Doctrine也将分离集合中的所有B实体.

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

  • 应该注意的是,调用`merge()`将导致非托管实体覆盖托管实体的属性。在执行“persist()”时,现在托管的实体将针对该实体的表执行更新。这可能会导致意外的数据丢失。 (4认同)