Hola a todos.
tengo un problema con eventos de Doctrine en Symfony que no puedo solucionar. Intentaré ser rápido y simple: en una entidad item
, tengo una propiedad versión
de tipo datetime
que se setea a la fecha/hora del momento en el que actualiza. Hasta ahí todo correcto: cuando se actualiza la entidad, se llama a la función definida para actualizar la versión.
/** * Item * * @ORM\Table() * @ORM\Entity() * @ORM\HasLifecycleCallbacks() */ class Item { ... /** * @ORM\PreUpdate() */ public function setVersion() { $this->version= new \DateTime(); }
Por otra parte, tengo una entidad subitem
definida de la siguiente manera:
/** * Subitem * * @ORM\Table() * @ORM\Entity() * @ORM\HasLifecycleCallbacks() */ class Subitem { // ... /** * @ORM\OneToOne(targetEntity="AppBundle\Entity\Item") */ private $item; // ... /** * @ORM\PreUpdate() */ public function updateItem() { $this->getItem()->setVersion(new \DateTime()); }
En este caso, al ejecutar $em->flush()
, consigo que se llame al evento PreUpdate
y se actualice el valor de la versión. Sin embargo, esta modificación, no se persiste en la base de datos.
¿Es correcto lo que estoy tratando de hacer?
Un saludo y muchas gracias de antemano.
Respuestas
Me temo que lo que quieres hacer no es posible de esa manera ya que Doctrine no lo permite. La solución consiste en utilizar los eventos de Doctrine en vez de los Lifecycle Callbacks. En este artículo muestran un ejemplo de esta limitación y cómo resolverla con los eventos.
@javiereguiluz
Es lo que me temía.
Mediante eventos lo tenía ya resuelto, pero por simplificar código en la aplicación pensé que también había manera de resolverlo así.
La verdad es que es una gran limitación por parte de Doctrine.
¡Muchas gracias Javier!
@KePitt2