Как управлять десериализованными сущностями с помощью менеджера сущностей?
Я использую JMSSerializerBundle для сериализации своих сущностей для json и десериализации json в сущности, но я думаю, что этот вопрос применим для любых методов десериализации.
Например, эта схема:
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;
}
Карты к этому JSON:{"id":1,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]}
и тот же самый JSON должным образом десериализован в объект типаMyBundle:Order у которого есть коллекция из двухMyBundle:Order/Item объекты.
Проблема в том, что когда я пытаюсь сохранить этот объект, в базе данных создаются новые записи, а не обновляются существующие, игнорируя идентификаторы. Как мне сказать менеджеру сущностей, что эти объекты должны быть обновлены, а не созданы?
Update, В общем, решение EntityManager :: merge (как предлагает DaveM) - это хорошо. Но вы должны только объединить существующие объекты. Например, если у вас есть json, который представляет новую сущность Order, связанную с существующими сущностями Order \ Item
{"id":null,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]}
В этом случае вы не можете просто объединить объект Order следующим образом:
$em->merge($order)
потому что order - это новая сущность, а менеджер сущностей попытается найти объект Order с id = null, и вы получите новый Order и массив пустых элементов. Поэтому решение состоит в том, чтобы зациклить массив Order :: $ items и объединить каждый элемент по отдельности. Затем будет создан новый заказ и связан с существующими элементами.