2017-03-22 7 views
0

フィールドを実際に変更せずにエンティティを更新する方法はありますか?フィールドを変更しないsymfonyアップデートエンティティ

$em = $this->getDoctrine()->getManager(); 
$test = $em->getRepository('AppBundle:MyObject')->find($id); 

$test->setName("Test"); 
$em->flush(); 

たとえば、以前に "Test2"のような名前に設定されていた場合に機能します。しかし、これが "テスト"だった場合、これは動作しません。だから私はsetName行を削除して、エンティティを更新したいと思います。

私はMyObjectが変更されたときにのみ実行されるリスナーを持っているため、この必要があります。

私は$em->refresh($test);を試しましたが、動作しません。

答えて

0

だけでなく、私はあなたのリスナーの実装を再考をお勧めしますか、あなたが

$em = $this->getDoctrine()->getManager(); 
$test = $em->getRepository('AppBundle:MyObject')->find($id); 

$originalName = $test->getName(); 

$test->setName("Whatever"); 
$em->flush(); 

$test->setName($originalName) 
$em->flush(); 

私はこのソリューションをお勧めしません。この(非常に醜い)回避策を行うことができます...あなたがオブジェクトを更新したいが、何が変更されましたリスナーを実際に必要なときにトリガーするように実装する必要があります。

0

Doctrine UnitOfWorkの作業を説明しているように、リスナーのイベントは、それらが起動し、オブジェクトの以前の状態とオブジェクトの意図された状態の違いを調べることを意味します。 Doctrineに変更されていないものを残す方法を考えることはできません。

この場合、リスナーは必要ありません。私はあなたが明示的に呼び出すサービスがほしいと思う。 TestServiceで

$em = $this->getDoctrine()->getManager(); 
$test = $em->getRepository('AppBundle:MyObject')->find($id); 

$testService = $this->get('test_service'); 
$testService->whatMethodYouWantToRunRegardlessOfChanges($test); 
$em->flush(); 

そして:

public function whatMethodYouWantToRunRegardlessOfChanges(Test $test) { 
    //code that you were running in your listener, called every time 
} 
関連する問題