jmsserialize不会以正确的方式反序列化OneToOne实体

时间:2016-09-26 18:45:19

标签: symfony doctrine-orm jmsserializerbundle jms-serializer

我有两个实体:UserUserInfo

class User
{

    ...

    /**
     * @ORM\OneToOne(targetEntity="UserInfo")
     * @ORM\JoinColumn(name="userinfo_id", referencedColumnName="id_user")
     * @Serializer\Groups({"o", "i-self-editUser"})
     */
    private $userInfo;

    ...

}

class UserInfo
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_user", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="users_id_user_seq", allocationSize=1, initialValue=1)
     */
    private $idUser;

    ...

}

我试图通过JMSSerializer及其Doctrine Contructor对用户进行反序列化。如果未指定UserInfo,一切正常。用户从数据库加载,发送的字段更新:

发送:

{
    "username": "test@test.us",
    "email": "test@test.us",
    "name": "test",
    "lang": "en-US"
}   

我反序列化的是User's和UserInfo的加载良好。

但是如果我尝试发送这样的东西:

{
    "username": "test@test.us",
    "email": "test@test.us",
    "name": "test",
    "lang": "en-US"
    "user_info": {
        "short_date_format": "Y-m-dd"
    }
}   

short_date_format已更新并序列化,但不会从数据库加载所有其他字段,将所有字段设置为null。这不是我想要的行为。我该如何解决这个问题?

更新

我认为我最好修补单个"嵌套级别"如果我想做得好URL可能类似于此(FOSRestbundle控制器的注释):

* @Patch("/users/{username}/userInfo", requirements={"username"=".+(\.)?\w+"})

这样,我可以按照Ocramius' piece of suggestion修补userInfo。谁能给我一些关于此的反馈?你认为为了实现一个合适的补丁可能是一个好的/最好的做法吗?

1 个答案:

答案 0 :(得分:0)

JMSSerializer不是为了让您的实体尽可能与数据库保持相似而编写的。您可以进行简单的序列化或反序列化。有一些代码示例,用户可以创建一些工厂来实现您的目标。

您是否尝试将反序列化的实体合并到EntityManager中?它应该满足你的需求。