2012-05-20 2 views
3

Мне нужно сохранить в базе данных историю изменений профиля. За исключением данных профиля я должен сохранить timestamp и user_id. Запрос на создание новой записи истории прост:Symfony2 и Doctrine2 - история изменений записи

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 

ответ

0

Наконец, я не использовал этот комплект. В контроллере после формы POST с данными и очистке EntityManager я добавил функцию, которая копирует запись непосредственно в базу данных (добавляет некоторые сведения о версии на этом пути). Но я использовал идею с другой таблицей для информации о ревизии из пакета.

1

Doctrine2 имеет тип поля даты и времени. Посмотрите на doctrine's datetime examples. Однако, если это возможно, вы можете захотеть разрешить создание дескриптора базы данных createdOn и/или modifiedOn через механизмы или триггеры метки времени. Кроме того, sql не должен находиться в ваших сущностях. Если вам нужен пользовательский sql, он должен войти в ваши репозитории Custom Entity.

Я не уверен, что вы ищете только временную метку «createdOn» или «updatedOn» или и то, и другое. Doctrine's versioning (раздел 9.2.1) можно было бы рассматривать и использовать в качестве поля «updatedOn» datetime.

+1

* в ваших репозиториях. Entity Manager управляет уже созданными объектами. – meze

+0

Последняя ссылка от вас касается транзакций и блокировки. Как это может быть полезно для меня? – koral

+0

@meze Спасибо за исправление –

7

Вы можете использовать комплект EntityAudit для управления версиями объектов.

+0

Я пробовал, но я потерпел неудачу - я изменил вопрос. – koral

+0

После выполнения инструкции «doctrine: schema: update -force» [использование] (https://github.com/simplethings/EntityAudit#usage). EntityAudit автоматически создает ревизию при сохранении или обновлении объекта до db. –

+0

'doctrine: schema: update -force' создал только таблицу' revisions', а не 'profile_audit' – koral

Смежные вопросы