Мне нужно сохранить в базе данных историю изменений профиля. За исключением данных профиля я должен сохранить timestamp и user_id. Запрос на создание новой записи истории прост:Symfony2 и Doctrine2 - история изменений записи
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
* в ваших репозиториях. Entity Manager управляет уже созданными объектами. – meze
Последняя ссылка от вас касается транзакций и блокировки. Как это может быть полезно для меня? – koral
@meze Спасибо за исправление –