有没有办法在不实际更改任何字段的情况下更新实体。
$em = $this->getDoctrine()->getManager();
$test = $em->getRepository('AppBundle:MyObject')->find($id);
$test->setName("Test");
$em->flush();
例如,如果名称设置为" Test2"之前。但如果它是"测试"在此之前没有工作。所以我想删除setName行,只是更新实体。
我需要这个原因我有一个只在MyObject更改时运行的监听器。
我试过了$em->refresh($test);
,但它没有用。
答案 0 :(得分: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();
我不建议使用此解决方案,您应该以每次需要时触发的方式实现您的侦听器。
答案 1 :(得分:0)
听众中的事件就像你在描述Doctrine UnitOfWork上的工作一样 - 意味着他们开火,然后看看对象的先前状态和对象的预期状态之间的差异。我想不出一种方法可以让Doctrine坚持一些没有改变的东西。
在这种情况下,我认为你不想要听众。我想你想要一个你明确调用的服务。
$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
}