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

时间:2015-09-15 13:29:33

标签: symfony orm doctrine many-to-many one-to-many

我对像ManyMoMany,oneToMany等实体之间的关系感到有点困惑。

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

例如:

多对多

类别实体:

manyToMany:
    posts:
      targetEntity: PostEntity
      mappedBy: taxonomies

情景一:

如果删除或删除其中一个类别,请立即删除post_taxonomy_relations表中的所有关系。我们可以用它做什么? Cascade或Orphanremoval?

发布实体:

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

情景二:

如果您只删除(db level)其中一条记录,请删除post_taxonomy_relations

中的相关实体

oneToMany&多对一

发布模板实体:

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

情景一:

如果您删除其中一个实体,请删除相关帖子。适用于cascade: ["remove"]。但是如果你删除这个实体(db level)也设置null或删除相关的帖子。我们怎么做到这一点?

发布实体:

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

如果您删除或删除此帖子,请不执行任何操作。

好的,我正在尝试习惯这些级联操作。

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

1 个答案:

答案 0 :(得分:3)

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

要依赖数据库级级联操作代替删除操作,您可以通过将 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();