2017-03-22 8 views
0

Gibt es eine Möglichkeit, die Entität zu aktualisieren, ohne tatsächlich Felder zu ändern.Symfony update entity ohne Feld zu ändern

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

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

Funktioniert zum Beispiel, wenn der Name auf etwas anderes wie "Test2" zuvor festgelegt wurde. Aber wenn es "Test" war, wird dies nicht funktionieren. Also möchte ich die setName Zeile entfernen und nur Entity aktualisieren.

Ich brauche dies, weil ich einen Listener habe, der nur ausgeführt wird, wenn sich MyObject ändert.

Ich versuchte $em->refresh($test);, aber es funktioniert nicht.

Antwort

0

gut, möchten Sie ein Objekt aktualisieren, aber irgendetwas geändert hat ... Ich empfehle die Umsetzung Ihrer Zuhörer zu überdenken oder Sie können diese (sehr hässlich) Abhilfe tun

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

$originalName = $test->getName(); 

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

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

Ich würde diese Lösung nicht empfehlen , sollten Sie Ihren Hörer wirklich so implementieren, wie er jedes Mal auslöst, wenn Sie es benötigen.

0

Die Ereignisse in einem Listener wie Sie beschreiben die Arbeit an der Lehre UnitOfWork - was bedeutet, dass sie feuern und dann die Unterschiede zwischen dem vorherigen Zustand des Objekts und dem beabsichtigten Zustand des Objekts betrachten. Ich kann mir keinen Weg vorstellen, Doctrine dazu zu bringen, etwas beizubehalten, das sich nicht geändert hat.

In diesem Fall glaube ich nicht, dass Sie einen Zuhörer wollen. Ich denke du willst einen Service, den du explizit anrufst.

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

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

Und dann in Testservice:

public function whatMethodYouWantToRunRegardlessOfChanges(Test $test) { 
    //code that you were running in your listener, called every time 
}