3

我需要保留 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. 在实体中,作为 preUpdate 的事件监听器

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

    但我不知道如何获取教义的连接对象

编辑 - 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
4

3 回答 3

7

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

于 2012-05-21T10:52:19.183 回答
1

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

我不确定您是在寻找“createdOn”时间戳还是“updatedOn”时间戳,或者两者兼而有之。Doctrine 的版本控制(第 9.2.1 节)可以被认为并用作“updatedOn”日期时间字段。

于 2012-05-20T23:45:36.330 回答
0

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

于 2012-11-08T00:07:37.347 回答