1

我正在尝试保存反序列化的 OneToMany 连接,但学说将父项 ($parent) 的 id 字段留空。

class MyParent
{
    /**
     * @ORM\OneToMany(targetEntity="MyChild", mappedBy="parent", cascade={"persist"})
     *
     * @Serializer\Expose
     * @Serializer\SerializedName("Children")
     * @Serializer\Type("ArrayCollection<MyNamespace\MyChild>")
     * @Serializer\XmlList(entry="Children")
     *
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    private $children;

}

class MyChild
{
    /**
     * @var MyParent
     *
     * @ORM\ManyToOne(targetEntity="MyParent", inversedBy="children")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     * })
     */
    private $parent;
}

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

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

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

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

我的配置有什么问题?

4

1 回答 1

1

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

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

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

合并实体是指将(通常是分离的)实体合并到 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 通知。

于 2015-06-11T21:27:43.780 回答