Wie verwalte ich deserialisierte Entitäten mit dem Entitätsmanager?

Ich verwende JMSSerializerBundle, um meine Entitäten zu json zu serialisieren und json in Entitäten zu deserialisieren, aber ich denke, diese Frage gilt für alle Deserialisierungstechniken.

Zum Beispiel dieses Schema:

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;

}

Karten zu diesem json:{"id":1,"items":[{"id":1,"amount":100}, {"id":2,"amount":200}]} und derselbe json wird ordnungsgemäß in ein Objekt vom Typ deserialisiertMyBundle: Bestellen das hat eine Sammlung von zweiMyBundle: Bestellung / Artikel Objekte.

Das Problem ist, dass, wenn ich versuche, dieses Objekt beizubehalten, neue Einträge in der Datenbank erstellt werden, anstatt vorhandene zu aktualisieren und die IDs zu ignorieren. Wie teile ich dem Entitätsmanager mit, dass diese Objekte aktualisiert und nicht erstellt werden sollen?

Aktualisieren. Im Allgemeinen ist die EntityManager :: Merge-Lösung (wie von DaveM vorgeschlagen) in Ordnung. Sie müssen jedoch nur vorhandene Objekte zusammenführen. Wenn Sie beispielsweise einen json haben, der eine neue Order-Entität darstellt, die mit vorhandenen Order \ Item-Entitäten verbunden ist

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

In diesem Fall können Sie ein Auftragsobjekt nicht einfach wie folgt zusammenführen:$em->merge($order), da order eine neue Entität ist, und der Entitätsmanager versucht, ein Order-Objekt mit der ID = null zu finden, und Sie erhalten ein neues Array mit Order und leeren Elementen. Die Lösung besteht also darin, das Array Order :: $ items zu durchlaufen und jedes Element einzeln zusammenzuführen. Dann wird eine neue Bestellung erstellt und mit vorhandenen Artikeln verbunden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage