1

メソッド内で変更されたエンティティの状態をロールバックする方法を見つけようとしていますpreUpdate(それが違いを生む場合は、注釈メソッドを使用しています)。

を使用してみましたがEntityManager::refresh($entity)、エンティティを元に戻すように見えますが、それでも先に進み、変更をデータベースに保存します。

呼び出して変更セットを再計算する必要があることを読みましたが、これではうまくいき$em->getUnitOfWork()->computeChangeSet($em->getClassMetaData(get_class($this)), $this);ません。

とにかくUnitOfWork、変更を無視して適切に再計算する方法はありますか?

<?php 
class Status extends Entity {

    /**
     * @PreUpdate
     */
    public function preUpdate() {
        if (!$this->canSave()) {
            $this->reset();
        }
    }

    public function reset() {
        $em = self::getEntityManager();
        $em->refresh($this);
        $em->getUnitOfWork()
           ->computeChangeSet($em->getClassMetaData(get_class($this)), $this);
    }

    public function canSave() { return false; }
?>

<?php
// Bootstrap for testing/debugging
include 'common.php';

$log = \Zend_Registry::get('log');

$x = Status::find(31); // Retrieve entity from DB
$log->debug("Original: " . $x->getDateLastSeen() . "\n");

$x->setDateLastSeen(new \DateTime());
$log->debug("Set to: " . $x->getDateLastSeen() . "\n");

$x->save();
$log->debug("Saved to: " . $x->getDateLastSeen() . "\n");

出力:

2013-02-14T23:13:22+00:00 DEBUG (7): Original: 2013-02-14 23:08:22
2013-02-14T23:13:22+00:00 DEBUG (7): Set to: 2013-02-14 23:13:22
2013-02-14T23:13:22+00:00 DEBUG (7): Saved to: 2013-02-14 23:08:22

すべて問題ないように見えますが、データベース ログを見ると、次のように表示されます。

409705 Query    UPDATE devices_statuses SET date_last_seen = '2013-02-14 23:13:22' WHERE id = 31
409705 Query    commit
4

1 に答える 1

2

これは、ORM 自体によって既に処理されています ( https://github.com/doctrine/doctrine2/blob/2.3.2/lib/Doctrine/ORM/UnitOfWork.php#L970-L974を参照) 。

ここでの問題は、DateTime割り当てられたインスタンスdate_last_seen(またはそれにマップされたフィールド) が異なるオブジェクト ハッシュを持っていることです ( で確認してくださいspl_object_hash())。

ORM の場合、これは変更セットです。インスタンスを効果的にリセットするには、手動で を呼び出す必要がありますDoctrine\ORM\UnitOfWork#clearEntityChangeSet(spl_object_hash($this))

また、このコードをエンティティから専用のイベント リスナに移動することを検討してください。エンティティはEntityManager、永続化レイヤーをまったく認識しないようにする必要があります。

于 2013-02-15T08:56:51.447 に答える