我正在尝试保存反序列化的OneToMany连接,但是doctrine会将父项($ parent)的id-field留空。
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 Serializer:
$entity = $serializer->deserialize($myXmlAsString, 'MyNamespace\MyParent', 'xml');
$entityManager->persist($entity);
$entityManager->flush($entity);
结果: 所有数据都保存到数据库中,但子列的parent_id为空!
xml不包含任何ID。无论如何,id都被排除在(de)序列化之外,因为我想忽略它们。
我的配置有什么问题?
答案 0 :(得分:1)
我认为你应该在坚持之前合并你的实体。
尝试在persist之前添加$entity = $entityManager->merge($entity);
并将, "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 Notice。