我需要保留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
答案 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表单后的控制器中,我添加了直接在数据库中复制记录的功能(在路上添加一些修订信息)。但是我使用了不同表格的想法来获取捆绑包中的修订信息。