我需要保留 Profile 更改的数据库历史记录。除了配置文件数据,我必须保存时间戳和 user_id。查询创建新的历史记录很简单:
INSERT INTO history_profile
SELECT NULL, CURRENT_TIMESTAMP(), p.* FROM profile p WHERE p.profile_id=?
这个查询放在哪里?我不能使用触发器。我有几个想法:
在控制器中调用提交表单
$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();
但是即使配置文件没有更新,每次提交都会执行此查询。
在实体中,作为 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