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.