首页 > 解决方案 > 反序列化对应于父实体引用的 JSON 键 (Symfony Serializer)

问题描述

假设我有一个简单的 Post 实体,具有 $author ManyToOne 关系:

Class Post {
     /**
     * @ORM\ManyToOne(targetEntity=Author::class, inversedBy="posts")
     * @ORM\JoinColumn(nullable=false)
     */
    private $author;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;
    
    ...
}

然后是这样的控制器功能:

public function create(Request $request, EntityManagerInterface $em, SerializerInterface $serializer): Response
    {
        $data = $request->getContent();

        $post = $serializer->deserialize($data, Post::class, 'json');

        $em->persist($post);
        $em->flush();
    }

JSON 格式 $data 如下所示:

{
    "author": { "id": 10 },
    "title": "My Title",
    ...
}

有没有办法让序列化器将作者 ['id'] 反序列化为它的实体引用?

我读到这是Symfony 的 PropertyInfo 组件在启用时应该做的事情。但即使启用了 PropertyInfo,persist 操作仍在创建新作者而不是引用现有作者(Doctrine 生成新作者行而不是设置帖子行的 author_id)

标签: phpsymfonydoctrinesymfony5

解决方案


也许通过添加cascade={"persist"}$author 属性注释?或强制设置器`

$post = $serializer->deserialize($data, Post::class, 'json');

$post->setAuthor($em->getRepository(Author::class)->findOneBy([])); `


推荐阅读