我使用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的目的:訂單具有兩個MyBundle一個總彙:訂單/ Item對象。
問題是,當我試圖堅持這個對象時,在數據庫中創建了新的條目,而不是更新現有的,忽略了ID。我如何告訴實體經理這些對象應該更新,而不是創建?
更新。通常EntityManager :: merge解決方案(由DaveM建議)很好。但是你只能合併現有的對象。例如,如果您有一個代表連接到現有Order \ Item實體的新Order實體的json
{「id」:null,「items」:[{「id」:1,「amount 「:100},{」 ID 「:2,」 金額「:200}]}
在這種情況下,你不能只是合併Order對象是這樣的: $em->merge($order)
,因爲訂單是一個新的實體和實體經理將嘗試查找id = null的Order對象,並且您將以新的Order和空項目數組結束。所以解決方案是循環Order :: $ items數組並單獨合併每個項目。然後將創建一個新的訂單並與現有的物品連接。