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 にマップします。同じ json が、2 つのMyBundle:Order/Itemオブジェクトのコレクションを持つMyBundle:Order{"id":1,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]}
型のオブジェクトに適切に逆シリアル化されます。
問題は、このオブジェクトを永続化しようとすると、ID を無視して既存の更新ではなく、データベースに新しいエントリが作成されることです。これらのオブジェクトを作成するのではなく、更新する必要があることをエンティティマネージャーに伝えるにはどうすればよいですか?
更新します。一般に、EntityManager::merge ソリューション (DaveM の提案による) で問題ありません。ただし、既存のオブジェクトのみをマージする必要があります。たとえば、既存の Order\Item エンティティに接続されている新しい Order エンティティを表す json がある場合
{"id":null,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]}
この場合、次のように Order オブジェクトをマージすることはできません:
$em->merge($order)
order は新しいエンティティであり、エンティティ マネージャーは id = null の Order オブジェクトを見つけようとし、新しい Order と空の items 配列になるためです。したがって、解決策は Order::$items 配列をループし、各アイテムを個別にマージすることです。次に、新しい注文が作成され、既存のアイテムに接続されます。