我有2张桌子。一个让我们说组织和第二个组织是organization_history。然后我有一个表actions_history与具体行动,......但在这种情况下它并不那么重要。 在组织历史中,我保留了修订版和organizationId。在删除表组织之前一切正常。我的想法是将每个动作保存在历史表中。在INSERT,UPDATE和DELETE操作上。但问题是当我尝试删除组织表时。我得到了这个输出:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`database`.`base_organizationsHistory`, CONSTRAINT `FK_EAF457A532C8A3DE` FOREIGN KEY (`organization_id`) REFERENCES `base_organizations` (`id`))
1)是否可以删除组织表并保留历史表并忽略外键。或者确实存在不同甚至是明确的解决方案?
2)我也在考虑生命周期回调。在INSERT和UPDATE操作中,我很容易连接表,但是当我可以在删除操作上创建历史表时,不可能使用postRemove回调,因为那时我没有旧数据可以复制到历史记录中。如果我使用preRemove回调,那就不那么清楚了。这样做有什么好主意吗?
Organization.orm.yml:
BaseBundle\Entity\Organization:
type: entity
table: base_organizations
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
name:
type: string
length: 128
type:
type: string
length: 64
oneToMany:
organizationHistory:
targetEntity: OrganizationHistory
mappedBy: organization
nullable: true
lifecycleCallbacks:
postPersist: [saveInsertHistory]
postUpdate: [saveUpdateHistory]
preRemove: [saveDeleteHistory]
和OrganizationHistory.orm.yml
BaseBundle\Entity\OrganizationHistory:
type: entity
table: base_organizationsHistory
uniqueConstraints:
organization_history_idx:
columns: [ organizationId, revision ]
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
name:
type: string
length: 128
type:
type: string
length: 64
revision:
type: integer
nullable: false
organizationId:
type: integer
nullable: false
createdAt:
type: datetime
nullable: false
updatedAt:
type: datetime
nullable: false
manyToOne:
organization:
targetEntity: Organization
inversedBy: organizationHistory
nullable: true
lifecycleCallbacks:
preUpdate: [ setUpdateTimestamp ]
prePersist: [ setCreationTimestamp, setUpdateTimestamp ]
答案 0 :(得分:1)
您无法从一个表中删除数据,也希望在其他表中存储与组织相关的数据。这就是为什么要建立关系...但是,你正在使用symfony,做“软删除”,它只会将实体标记为已删除,但数据仍将存在于您的数据库中。
也许你可以从这里开始https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/softdeleteable.md