Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Eventos/LifecycleCallbacks de Doctrine en entidades

11 de junio de 2015

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

#1

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

11 junio 2015, 21:37
#2

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

12 junio 2015, 9:18