es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Serializar propiedades seleccionadas de una relación con el Serializador.

Tengo dos entidades de Doctrine:

/**
 * @ORM\Table()
 */
class User {
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string" ,nullable=false)
     */
    private $name;

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Post")
     */
    private $posts;
}

/**
 * @ORM\Table()
 */
class Post {
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string", nullable=false)
     */
    private $content;
}

¿Es posible utilizar el componente Serializer para serializar solamente la propiedad id de cada entidad en la propiedad ‘posts’ de User?

Por ejemplo:

{
    "id": 79,
    "name": "User 1",
    "post": [
      {
        "id": 73,
      }
    ],
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible serializar solo la propiedad “id” de cada entidad en la propiedad “posts” de la entidad User al utilizar el componente Serializer en Symfony.

    Esto se puede lograr utilizando la anotación “@Groups” en las clases de entidad, para especificar qué propiedades deben incluirse durante la serialización.

    En este caso, podemos modificar la entidad User de la siguiente manera:

    use Symfony\Component\Serializer\Annotation\Groups;
    
    /**
     * @ORM\Table()
     */
    class User {
        /**
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         * 
         * @Groups({"user"})
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string", nullable=false)
         * 
         * @Groups({"user"})
         */
        private $name;
    
        /**
         * @var ArrayCollection
         *
         * @ORM\ManyToMany(targetEntity="Post")
         * @Groups({"posts"})
         */
        private $posts;
    }
    

    Y también modificar la entidad Post de la siguiente manera:

    use Symfony\Component\Serializer\Annotation\Groups;
    
    /**
     * @ORM\Table()
     */
    class Post {
        /**
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         * 
         * @Groups({"posts"})
         */
        private $id;
    
        /**
         * @var string
         *
         * @ORM\Column(type="string", nullable=false)
         * 
         * @Groups({"posts"})
         */
        private $content;
    }
    

    Aquí, hemos agregado la anotación “@Groups” a cada propiedad que queremos incluir durante la serialización.

    Luego, al serializar una entidad User, podemos especificar qué grupos incluir utilizando la opción “groups” en el Serializer:

    $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
    $user = $userRepository->findOneById(79);
    $data = $serializer->serialize($user, 'json', ['groups' => ['user', 'posts.id']]);
    

    En este caso, hemos especificado el grupo “user”, que incluirá las propiedades “id” y “name” de la entidad User, y el grupo “posts.id”, que incluirá solo la propiedad “id” de cada entidad en la ArrayCollection “posts”.

    Los datos JSON resultantes se verán así:

    {
        "id": 79,
        "name": "Usuario 1",
        "posts": [
            {
                "id": 73
            }
        ]
    }
    

    Aquí, solo se incluye la propiedad “id” de la entidad Post, como se especifica en el grupo “posts.id”.

Comments are closed.