3

プロファイルの変更のデータベース履歴を保持する必要があります。プロファイルデータを除いて、タイムスタンプとuser_idを保存する必要があります。新しい履歴レコードを作成するためのクエリは簡単です。

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
4

3 に答える 3

7

EntityAuditバンドルを使用してエンティティをバージョン管理できます。

于 2012-05-21T10:52:19.183 に答える
1

Doctrine2には日時フィールドタイプがあります。教義の日時の例を見てください。ただし、可能であれば、データベースにタイムスタンプメカニズムまたはトリガーを介してcreatedOnおよび/またはmodifiedOnを処理させることを検討することをお勧めします。また、sqlはエンティティに入れないでください。カスタムSQLが必要な場合は、カスタムエンティティリポジトリに配置する必要があります。

「createdOn」タイムスタンプのみ、「updatedOn」タイムスタンプ、またはその両方を探しているのかわかりません。Doctrineのバージョン管理(セクション9.2.1)は、「updatedOn」日時フィールドと考えて使用できます。

于 2012-05-20T23:45:36.330 に答える
0

最後に、私はこのバンドルを使用していません。データを含むPOSTフォームとEntityManagerのフラッシュ後のコントローラーで、データベースにレコードを直接コピーする関数を追加しました(途中でいくつかのリビジョン情報を追加します)。しかし、バンドルからのリビジョン情報には、別のテーブルのアイデアを使用しました。

于 2012-11-08T00:07:37.347 に答える