对数据库关系有点困惑 - 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();
我对 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();