jmsserialize неправильно десериализует объект OneToOne

У меня есть две сущности: User и UserInfo:

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": "[email protected]",
    "email": "[email protected]",
    "name": "test",
    "lang": "en-US"
}   

То, что я десериализую, хорошо загружено User и UserInfo.

Но если я попытаюсь отправить что-то вроде этого:

{
    "username": "[email protected]",
    "email": "[email protected]",
    "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+"})

таким образом, я могу исправить userInfo, следуя части Окрамиуса предложения. Может ли кто-нибудь дать мне отзыв об этом? Как вы думаете, может ли это быть хорошей/лучшей практикой для реализации достойного патча?


person Bertuz    schedule 26.09.2016    source источник
comment
Отношение OneToMany или OneToOne?   -  person Matteo    schedule 26.09.2016
comment
Я такой глупый. Слишком привык к таким отношениям.. Сразу исправлю вопрос. Спасибо.   -  person Bertuz    schedule 26.09.2016


Ответы (1)


JMSSerializer написан не для того, чтобы ваши объекты были максимально похожи на базу данных. Вы можете сделать простую сериализацию или десериализацию. Есть несколько примеров кода, где пользователи создают фабрики для достижения вашей цели.

Вы пытались объединить свой десериализованный объект в EntityManager? Он должен соответствовать вашим потребностям.

person michail_w    schedule 26.09.2016
comment
слияние фактически дает тот же результат. Может быть, потому что он обрабатывает десериализованный нуль как новое значение для перезаписи? Не могли бы вы предоставить мне несколько примеров фабрик, чтобы получить вдохновение? Спасибо - person Bertuz; 27.09.2016
comment
Не могли бы вы дать мне отзыв о моем обновленном вопросе? Спасибо - person Bertuz; 27.09.2016
comment
Вы сериализуете/десериализуете только сущности доктрины? Проверьте принятый ответ из этого сообщения как обновить сущность доктрины symfony2 из политики включения групп jmsserial">stackoverflow.com/questions/16525849/, если вы это сделаете. - person michail_w; 27.09.2016