Symfony2 和 Doctrine2 - 记录变更历史

标签 symfony doctrine-orm

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

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

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

  1. 在提交表单时调用的 Controller 中

    $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 试用

这个 bundle 看起来很有前途,但我无法配置它。我正确安装了它,当我添加到 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

最佳答案

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

关于Symfony2 和 Doctrine2 - 记录变更历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677261/

相关文章:

symfony - 在 Twig 中访问枚举值

php - 为什么我在将 Symfony 4 应用程序部署到 Heroku 时遇到问题?

Symfony 最佳实践 : Where to place these constants?

javascript - VichUploader 和 CroppieJS : how to send a base64 cropped image to persist in Symfony 4

php - Doctrine中如何基于动态变量进行动态关联?

php - 如何在 Doctrine 2 中使用 WHERE IN

php - Symfony2 - Doctrine 和 FOSUserBundle - 错误的注释

php - Symfony 2.0 在实体内部获取服务

MySQL 无法在 SqLite 中运行 我可以使用 Doctrine2 查询生成器构建它吗?

php - 教义查询生成器 DATE_FORMAT 不工作