理解教义级联操作

2022-08-30 08:17:20

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

如果我在 a 和 和 set 之间定义一个多对多关系,我明白这将:CustomerInsureecascade{"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;

如果我定义一个 和 和 集合之间的反数对多关系,我明白这将:InsureeCustomercascade{"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

持久化和删除

关于坚持实体 A,教义也将继续集合中的所有 B 实体的含义,您是正确的。cascade={"persist"}

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

分离和合并

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

在集合中添加/删除实体是您需要执行的操作(在代码中)。在这里阅读有关的信息

分离意味着从实体管理器中分离实体。实体管理器将不再管理该实体。这使得分离的实体与新实例化的实体相同,只是它已经在数据库中(但你让 EntityManager 没有意识到这一点)。

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

合并分离相反:您将分离的实体合并回实体管理器。
请注意,实际上将返回一个新的托管对象,您传递给它的分离对象将保持非托管状态。merge()


答案 2

推荐