Symfony2和Doctrine2 - 记录变化的历史

时间:2012-05-20 21:14:35

标签: symfony doctrine-orm

我需要保留Profile的更改的数据库历史记录。除了配置文件数据,我必须保存时间戳和user_id。查询以创建新的历史记录很简单:

INSERT INTO history_profile 
SELECT NULL, CURRENT_TIMESTAMP(), p.* FROM profile p WHERE p.profile_id=?

哪里放这个查询?我不能使用触发器。我有几个想法:

  1. 在提交表单中调用的控制器中

    $em = $this->getEntityManager();
    $conn = $em->getConnection();
    if (!is_null($profile->getProfileId()))
    {
        $conn->executeQuery('INSERT INTO history_profile SELECT NULL, CURRENT_TIMESTAMP(), p.* FROM profile p WHERE p.profile_id=?', array($profile->getProfileId()));
    }
    $em->persist($profile);
    $em->flush();
    

    但即使没有对个人资料的更新,也会在每次提交时执行此查询。

  2. 实体中的
  3. ,作为preUpdate的事件监听器

    class Profile {
        /**
         * @ORM\preUpdate
         * @ORM\prePersist
         */
        public function onPrePersist()
        {
        }
    }
    

    但我不知道如何获得教条的连接对象

  4. 编辑 - EntityAudit试用

    这个捆绑看起来很有希望,但我无法配置它。我正确安装它,当我添加到config.yml:

    simple_things_entity_audit:
        audited_entities:
            - AldenXyzBundle\Entity\Profile
    

    并查看了

    之后的查询
    php ./app/console doctrine:schema:update --dump-sql
    

    但是只有用于创建表修订的SQL:

    CREATE TABLE revisions (id INT AUTO_INCREMENT NOT NULL, 
    timestamp DATETIME NOT NULL, username VARCHAR(255) NOT NULL, 
    PRIMARY KEY(id)) ENGINE = InnoDB
    

3 个答案:

答案 0 :(得分:7)

您可以使用EntityAudit捆绑包对您的实体进行版本控制。

答案 1 :(得分:1)

Doctrine2具有日期时间字段类型。看看doctrine's datetime examples。但是,如果可能,您可能需要考虑让数据库处理createdOn和/或modifiedOn通过它的时间戳机制或触发器。此外,sql不应该进入你的实体。如果您需要自定义sql,它应该放在您的自定义实体存储库中。

我不确定您是否只查找“createdOn”时间戳或“updatedOn”时间戳或两者。 Doctrine's versioning(第9.2.1节)可以被认为并用作“updatedOn”日期时间字段。

答案 2 :(得分:0)

最后我还没有用过这个包。在带有数据和刷新EntityManager的POST表单后的控制器中,我添加了直接在数据库中复制记录的功能(在路上添加一些修订信息)。但是我使用了不同表格的想法来获取捆绑包中的修订信息。