理解学术级联操作
我想检查我对Doctrine关联的级联操作的理解。 为了这个问题,我有两个模型: Customer
和Insuree
。
如果我定义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;
如果我定义了Insuree
和Customer
之间的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理的。