プロファイルの変更のデータベース履歴を保持する必要があります。プロファイルデータを除いて、タイムスタンプと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