2

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 配列をループし、各アイテムを個別にマージすることです。次に、新しい注文が作成され、既存のアイテムに接続されます。

4

2 に答える 2

6

エンティティのマージとは、エンティティを再度管理できるようにするために、エンティティをEntityManagerのコンテキストにマージすることを指しているため、このmerge()メソッドを使用する必要があります。EntityManagerエンティティの状態をEntityManagerにマージするには、EntityManager#merge($ entity)メソッドを使用します。渡されたエンティティの状態は、このエンティティの管理されたコピーにマージされ、このコピーはその後返されます。

$detachedEntity = unserialize($serializedEntity); 
$entity = $em->merge($detachedEntity);

また、エンティティをシリアル化/非シリアル化する場合は、すべてのエンティティプロパティを非公開ではなく保護する必要があることに注意してください。これは、以前はプロキシインスタンスであったクラスをシリアル化すると、プライベート変数がシリアル化されず、PHP通知がスローされるためです。

詳細については、次の教義のドキュメントを参照してください。

http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

于 2012-06-26T19:11:11.650 に答える