对数据库关系有点困惑 - Doctrine2 YAML

A bit confused about database relations - Doctrine2 YAML

我对 manyToMany、oneToMany 等实体之间的关系有点困惑

我真正感到困惑的是,如果我从数据库中删除或删除一条记录,我们怎么能说删除关系实体呢。

例如:

多对多

类别实体:

manyToMany:
    posts:
      targetEntity: PostEntity
      mappedBy: taxonomies

场景一:

如果您移除或删除其中一个类别,请立即删除 post_taxonomy_relations table 中的所有关系。我们可以用什么来做到这一点?级联或孤儿移除?

Post实体:

manyToMany:
    taxonomies:
      targetEntity: TaxonomyEntity
      inversedBy: posts
      joinTable:
        name: post_taxonomy_relations
        joinColumns:
          post_id:
            referencedColumnName: id
        inverseJoinColumns:
          taxonomy_id:
            referencedColumnName: id

场景二:

如果您只删除(数据库级别)其中一条记录,请删除 post_taxonomy_relations

中的相关实体

一对多和多对一

Post 模板实体:

  oneToMany:
    products:
      targetEntity: PostEntity
      cascade: ["remove"]
      mappedBy: post_template
      joinColumn:
        name: id
        referencedColumnName: template_id

场景一:

如果您删除其中一个实体,请删除相关的 post。与 cascade: ["remove"] 一起工作。但是,如果您删除此实体(数据库级别),请设置为空或删除相关的 posts。我们该怎么做?

Post实体:

  manyToOne:
    template:
      targetEntity: PostTemplateEntity
      inversedBy: products
      joinColumn:
        name: template_id
        referencedColumnName: id

如果您移除或删除此 post,什么也不做。

好的,我正在努力适应这些级联操作。

每一个有样本的答案,对我来说都是最有价值的。谢谢。

级联操作在内存中执行。这意味着集合和相关实体被提取到内存中,即使它们在即将执行级联操作时仍被标记为惰性。

要改为依靠 数据库级别 级联操作进行删除操作,您可以使用 onDelete 选项配置每个连接列,方法是设置它 CASCADE.

当使用 orphanRemoval=true 选项时,Doctrine 假设实体是私有的,不会被其他实体重用。如果你忽略这个假设,你的实体将被 Doctrine 删除,即使你将孤立的实体分配给另一个实体。

根据你的模板,你可以试试:

oneToMany:
  products:
    targetEntity: PostEntity
    mappedBy: post_template
    joinColumn:
      name: id
      referencedColumnName: template_id
      onDelete: CASCADE


manyToOne:
  template:
    targetEntity: PostTemplateEntity
    inversedBy: products
    cascade: ["remove"]
    joinColumn:
      name: template_id
      referencedColumnName: id

在多对多关系中,我不知道基于 yaml 配置。只有我知道是手动的,比如:

foreach ($user->getRoles() as $role) {
    $user->removeRole($role)
}
$em->remove($user);
$em->flush();