2014-12-20 82 views
0

我在Symfony 2.6.1項目中使用了Doctrine 2.4.6。問題在於preUpdate回調中對實體所做的更改未保存在數據庫中。代碼如下:學說preUpdate實際上並沒有改變實體

class MyListener { 
    public function preUpdate(PreUpdateEventArgs $args) { 
     $entity = $args->getEntity(); 
     $args->setNewValue('name', 'test'); 
     // echo $args->getNewValue('name'); --> prints 'test' 
    } 
} 

class DefaultController extends Controller { 
    /** 
    * @Route("/commit", name="commit") 
    */ 
    public function commitAction(Request $request) { 
     $content = $request->getContent(); 
     $serializer = $this->get('jms_serializer'); 
     /* @var $serializer \JMS\Serializer\Serializer */ 
     $em = $this->getDoctrine()->getManager(); 
     /* @var $em \Doctrine\Orm\EntityManagerInterface */ 
     $persons = $serializer->deserialize($content, 'ArrayCollection<AppBundle\Entity\Person>', 'json'); 
     /* @var $persons \AppBundle\Entity\Person[] */ 
     foreach($persons as $person) { 
     $em->merge($person); 
     } 
     $em->flush(); 
     return new JsonResponse($serializer->serialize($persons, 'json')); 
     // Person name is NOT 'test' here. 
    } 
} 
+0

仔細閱讀印刷精美/en/latest/reference/events.html#preupdate這是混淆的常見來源。 preUpdate事件有很多限制。 – Cerad

回答

0

preUpdate不允許您更改實體。您只能使用傳遞給事件的計算更改集來修改原始字段值。我敢打賭,如果您檢查數據庫,您將看到Person實體確實得到更新,您只是在$persons變量中看不到它們,直到下次手動檢索它們。

什麼,你就必須做後沖洗是從數據庫中檢索實體看到自己的更新值:http://doctrine-orm.readthedocs.org:

$em->flush(); 

$personIds = array_map(function($person) { return $person->getId(); }, $persons); 

$updatedPersons = $em->getRepository('AppBundle:Person')->findById($personIds); 

return new JsonResponse($serializer->serialize($updatedPersons, 'json'));