我试图保存一个反序列化的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通知。