Doctrine2 + symfony2使用FK保留历史记录表

时间:2014-03-22 20:32:55

标签: symfony doctrine-orm

我有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 ]

1 个答案:

答案 0 :(得分:1)

您无法从一个表中删除数据,也希望在其他表中存储与组织相关的数据。这就是为什么要建立关系...但是,你正在使用symfony,做“软删除”,它只会将实体标记为已删除,但数据仍将存在于您的数据库中。

也许你可以从这里开始https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/softdeleteable.md