我对像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:
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
如果您删除或删除此帖子,请不执行任何操作。
好的,我正在尝试习惯这些级联操作。
每个包含样本的答案对我来说都是最有价值的。谢谢。
答案 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();