了解理论级联操作


72

我想检查一下我对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;

如果我定义了InsureeandCustomer和set之间的逆多对多关系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
您是否可以通过创建Customers和Insurees并开始删除/添加记录来检查您对级联关系的理解是否正确?
未定义的2014年

Answers:


157

坚持并删除

你是正确的 cascade={"persist"}含义即持久化实体A,Doctrine也将持久化集合中的所有B实体。

cascade={"remove"}对于删除实体A的含义也很正确,Doctrine还将删除集合中的所有B实体。
但是我怀疑您是否会在ManyToMany关联上使用它,因为当您删除将该操作级联到所有B实体的实体A时,那些B实体可能与其他A实体关联。

分离并合并

您对和正确:cascade={"detach"}cascade={"merge"}

需要(在代码中)从Collection中添加/删除实体。在这里阅读有关内容。

分离意味着您将实体与EntityManager分离。EntityManager将不再管理该实体。这使得分离的实体与新实例化的实体相同,除了它已存在于数据库中(但您使EntityManager对此不了解)。

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

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


应当注意,调用merge()将导致非托管实体覆盖托管实体的属性。以后persist(),现在的受管实体将对该实体的表执行更新。这可能会导致意外的数据丢失。
凯文·梅西亚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.