理解学术级联操作

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

如果我定义Customer与被Insuree之间的多对多关系并设置cascade{"all"} ,则我明白这将会:

  • 向客户添加新的保险公司将坚持这位保险公司,并在连接表中创build一个关联。
  • 从收集中移除保险公司将把保险公司与顾客分离,并将顾客从保险公司中分离出来。
  • 删除客户将删除与客户相关的所有保险公司。

这是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之间的Insuree关系,并设置cascade{"all"} ,我知道这将会:

  • 向保险公司添加新客户将坚持这个客户,并在连接表中创build一个关联。
  • 将客户从收集品中移除将使顾客与保险公司分离,并将保险公司与顾客分离。
  • 删除保险公司将删除与之相关的所有客户。

这是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也将删除Collection中的所有B实体。
但是我怀疑你会想要在ManyToMany关联上使用它,因为当你删除将这个操作级联到所有B实体的实体A时,那些B实体可能与其他A实体关联。

分离和合并

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

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

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

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

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