Доктрина доктрины фактически не меняет сущность

0

Я использую Doctrine 2.4.6 в своем проекте Symfony 2.6.1. Проблема в том, что изменения, внесенные в объект в обратном вызове 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
    Внимательно прочитайте мелкий шрифт: doctrine-orm.readthedocs.org/en/latest/reference/… Это распространенный источник путаницы. Событие preUpdate имеет много ограничений.
Теги:
doctrine2

1 ответ

0

preUpdate не позволяет вам вносить изменения в ваши сущности. Вы можете использовать только вычисленный набор изменений, переданный этому событию, для изменения значений примитивного поля. Бьюсь об заклад, если вы проверите базу данных, вы увидите, что объекты Person получили обновление, вы просто не увидите их в переменной $persons до следующего раза, когда вы их вручную извлечете.

Что вам нужно сделать после флеша - получить сущности из базы данных, чтобы увидеть их значения обновлений:

$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'));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню