Jak zarządzać jednostkami zserializowanymi za pomocą menedżera encji?

Korzystam z JMSSerializerBundle, aby serializować moje jednostki do json i deserializować json w encje, ale myślę, że to pytanie dotyczy wszelkich technik deserializacji.

Na przykład ten schemat:

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;

}

Mapy do tego json:{"id":1,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]} a ten sam json jest prawidłowo deserializowany do obiektu typuMyBundle: Order który ma dwa spotkaniaMyBundle: Zamówienie / przedmiot przedmioty.

Problem polega na tym, że gdy próbuję utrwalić ten obiekt, nowe wpisy są tworzone w bazie danych, zamiast aktualizować istniejące, ignorując identyfikatory. Jak powiedzieć menedżerowi encji, że te obiekty powinny być aktualizowane, a nie tworzone?

Aktualizacja. Ogólnie rozwiązanie EntityManager :: merge (jak sugeruje DaveM) jest w porządku. Ale musisz tylko scalać istniejące obiekty. Na przykład, jeśli masz jona reprezentującego nowy podmiot zamówienia, który jest połączony z istniejącymi podmiotami zamówienia

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

W takim przypadku nie można po prostu scalić obiektu Zamówienia w następujący sposób:$em->merge($order), ponieważ kolejność jest nową jednostką, a menedżer jednostki spróbuje znaleźć obiekt Order o identyfikatorze = null, a skończy się na nowej tablicy Order i pustej pozycji. Rozwiązaniem jest więc pętla tablicy Order :: $ items i scalenie każdego elementu osobno. Następnie zostanie utworzone nowe zamówienie i połączone z istniejącymi elementami.

questionAnswers(2)

yourAnswerToTheQuestion