Como gerenciar entidades desserializadas com o gerenciador de entidades?

Eu estou usando JMSSerializerBundle para serializar minhas entidades para json e desserializar json em entidades, mas acho que esta questão se aplica a qualquer técnica de desserialização.

Por exemplo, este esquema:

class Order
{
    private $id;

    /**
     * @Serializer\Type("ArrayCollection<MyBundle\Entity\Order\Item>")
     * @ORM\OneToMany(targetEntity="\MyBundle\Entity\Order\Item", mappedBy="order", cascade={"persist"})
     */
    private $items;
}

class Item
{

    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="\MyBundle\Entity\Order", inversedBy="items")
     */
    private $order;

    /**
     * @var integer $amount
     * @Serializer\Type("integer")
     * @ORM\Column(name="amount", type="integer")
     */
    private $amount;

}

Mapas para este json:{"id":1,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]} e o mesmo json é devidamente desserializado em um objeto do tipoMyBundle: ordem que tem um colletion de doisMyBundle: pedido / item objetos.

O problema é que quando tento persistir esse objeto, novas entradas são criadas no banco de dados, em vez de atualizar as existentes, ignorando os ids. Como eu digo ao gerente da entidade que esses objetos devem ser atualizados e não criados?

Atualizar. Geralmente EntityManager :: solução de mesclagem (como sugerido por DaveM) está bem. Mas você deve apenas mesclar objetos existentes. Por exemplo, se você tiver um json que represente uma nova entidade Order conectada a entidades Order \ Item existentes

{"id": null, "items": [{"id": 1, "amount": 100}, {"id": 2, "amount": 200}]}

Nesse caso, você não pode simplesmente mesclar um objeto Order assim:$em->merge($order), porque order é uma nova entidade e o gerenciador de entidades tentará localizar um objeto Order com id = null e você terá um novo array Order e empty items. Portanto, a solução é fazer o loop da matriz Order :: $ items e mesclar cada item individualmente. Em seguida, um novo pedido será criado e conectado aos itens existentes.

questionAnswers(2)

yourAnswerToTheQuestion