JMS序列化程序、条令、持久化反序列化OneToMany



我试图保存一个反序列化的OneToMany连接,但原则将父项($parent)的id字段留空。

class MyParent
{
    /**
     * @ORMOneToMany(targetEntity="MyChild", mappedBy="parent", cascade={"persist"})
     *
     * @SerializerExpose
     * @SerializerSerializedName("Children")
     * @SerializerType("ArrayCollection<MyNamespaceMyChild>")
     * @SerializerXmlList(entry="Children")
     *
     * @var DoctrineCommonCollectionsArrayCollection
     */
    private $children;
}
class MyChild
{
    /**
     * @var MyParent
     *
     * @ORMManyToOne(targetEntity="MyParent", inversedBy="children")
     * @ORMJoinColumns({
     *   @ORMJoinColumn(name="parent_id", referencedColumnName="id")
     * })
     */
    private $parent;
}

我正在尝试使用JMS序列化程序:

$entity = $serializer->deserialize($myXmlAsString, 'MyNamespaceMyParent', 'xml');
$entityManager->persist($entity);
$entityManager->flush($entity);

结果:所有数据都保存到数据库中,但children的parent_id列为null!

xml不包含任何id。无论如何,ID都被排除在(反)序列化之外,因为我想忽略它们。

我的配置有什么问题?

我认为在持久化实体之前应该合并它。

尝试在持久化之前添加$entity = $entityManager->merge($entity);,并将, "merge"添加到级联选项

来自手册@http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#merging-实体

合并实体是指将(通常是分离的)实体合并到EntityManager的上下文中,以便它们再次得到管理。要将实体的状态合并到EntityManager中,请使用EntityManager#merge($entity)方法。传递的实体的状态将合并到此实体的托管副本中,随后将返回此副本。

示例:

<?php
$detachedEntity = unserialize($serializedEntity); // some detached entity
$entity = $em->merge($detachedEntity);
// $entity now refers to the fully managed copy returned by the merge operation.
// The EntityManager $em now manages the persistence of $entity as usual.

当您想要序列化/取消序列化实体时,必须保护所有实体属性,而不是私有属性。原因是,如果您序列化一个以前是代理实例的类,则私有变量将不会被序列化,并引发PHP通知。

相关内容

  • 没有找到相关文章

最新更新