JMSserializer десериализует связанную сущность Doctrine

У меня есть JSON, как это:

"relatedCollection": [
  {
     id:1,
     name: "something",
     country: {
           id:1
          }
  },
    {
     id:2,
     name: "something 2",
     country: {
           id:1
          }
  }

]

Два связанных элемента, которые имеют общую страну, существующую в базе данных. Если я десериализую с помощью JMSserializer, он создаст два разных экземпляра объекта COUNTRY.

Когда вы применяете слияние с доктриной, правильно установите страну на «что-то», а не на «что-то 2». Таким образом, результат после сохранения:

"relatedCollection": [
  {
     id:1,
     name: "something",
     country: {
           id:1
          }
  },
    {
     id:2,
     name: "something 2",
     country: null
  }

]

Для Doctrine есть две разные сущности, называемые Country, которые отделены друг от друга. И учение прикрепляет первое и сохраняет его должным образом, но не второе.

Это происходит только с отношениями ManyToOne, когда вы объединяете коллекцию с одним и тем же идентификатором связанной сущности. Если вы сохраните страну 1 и страну 2, повторяющейся страны не будет, поэтому сохраните свойство.

Любое решение?


person Serginho    schedule 19.05.2016    source источник


Ответы (1)


JMS Serializer просто выполняет десериализацию объекта, он не обрабатывает объект доктрины за вас.

Вы должны сделать любое слияние, каскадное слияние, например

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

Вы можете написать десериализацию Listener\Subscriber для автоматического слияния.

person ScayTrase    schedule 20.05.2016
comment
Спасибо, я не понял, как доктрина управляет сущностями, но я решил выполнить слияние и настроить каскадное слияние. - person Serginho; 20.05.2016
comment
Десериализованная сущность — обычное состояние при работе с сущностями доктрины. Сущности такого типа не привязаны к диспетчеру сущностей в момент десериализации, поэтому изменения не отслеживаются, отношения не разрешаются и т. д. Если вы вручную сохраняете сущность в этом состоянии, это приводит к созданию новой сущности. merge() прикрепляет отсоединенный объект к em и позволяет вам делать все обычные операции ООП после - person ScayTrase; 21.05.2016