Symfony更新实体而不更改字段

时间:2017-03-22 10:07:19

标签: symfony doctrine-orm

有没有办法在不实际更改任何字段的情况下更新实体。

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

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

例如,如果名称设置为" Test2"之前。但如果它是"测试"在此之前没有工作。所以我想删除setName行,只是更新实体。

我需要这个原因我有一个只在MyObject更改时运行的监听器。

我试过了$em->refresh($test);,但它没有用。

2 个答案:

答案 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
}