Symfony更新实体而不更改字段

Symfony更新实体而不更改字段,symfony,doctrine-orm,Symfony,Doctrine Orm,是否有一种方法可以在不实际更改任何字段的情况下更新实体 $em = $this->getDoctrine()->getManager(); $test = $em->getRepository('AppBundle:MyObject')->find($id); $test->setName("Test"); $em->flush(); 例如,如果名称在之前设置为“Test2”之类的其他名称,则此项工作。但如果这之前是“测试”的话,那就行不通了。所以我想删除

是否有一种方法可以在不实际更改任何字段的情况下更新实体

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

$test->setName("Test");
$em->flush();
例如,如果名称在之前设置为“Test2”之类的其他名称,则此项工作。但如果这之前是“测试”的话,那就行不通了。所以我想删除setName行,只更新实体

我需要这个,因为我有一个只在MyObject更改时运行的侦听器


我尝试了
$em->refresh($test)但它不起作用。

好吧,你想更新一个对象,但任何东西都改变了。。。我建议您重新考虑侦听器的实现,或者您可以做这个(非常难看的)解决方法

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

$originalName = $test->getName();

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

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

我不推荐这种解决方案,你真的应该按照每次需要时它触发的方式来实现你的侦听器。

侦听器中的事件,就像你描述的在Doctrine UnitOfWork上的工作一样——这意味着它们触发,然后查看对象的先前状态和预期状态之间的差异。我想不出一个办法让教条去坚持一些没有改变的东西

在这种情况下,我认为你不需要一个听众。我认为您需要一个明确调用的服务

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

$testService = $this->get('test_service');
$testService->whatMethodYouWantToRunRegardlessOfChanges($test);
$em->flush();
然后在TestService中:

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