メソッド内で変更されたエンティティの状態をロールバックする方法を見つけようとしています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