我正在使用Symfony2和Doctrine 2.0。我正在尝试从XML Feed中读取数据并将其映射到数据库中的新实体或现有实体。当XML Feed中的数据发生变化时,我需要更新现有的实体,但是当添加数据时,我应该创建新的实体。
在我的实体类中,我使用以下denormalize方法将XML数据映射到实体的属性:
function denormalize(SerializerInterface $serializer, $data, $format = null)
(在我的实体类中调用的Symfony \ Component \ Serializer \ Serializer中定义)
此方法的文档声明“重要的是要理解denormalize()调用应该递归地对执行器的所有子对象进行非规范化。”这就是我想要做的。但是实体不应该知道EntityManager,那么如果相关/子实体已经存在,我如何在denormalize()方法内检查?
亲切的问候, 马修
答案 0 :(得分:0)
在实体中调用EntityManager确实是一个坏主意(据我所知,在控制器之外)。
我从来没有遇到过这个问题,但是如果我是你,我会尝试在你的一个控制器中进行反规范化,或者如果它真的困扰你,你在一个控制器中调用的服务中,你给了它你的EntityManager(这里再次,最好在控制器本身做,或者只是将你的对象发送到服务,这样它就可以将xml非规范化为“对象”。)
最好是编写一个无论给定实体都能正常工作的控制器。
希望有所帮助!
答案 1 :(得分:0)
我认为我的问题出在我的方法中而不是我的代码!!
最初,每当我找到XML中表示的实体时,我会检查(使用EntityManager)以查看它是否是新的或现有的非正规化它。我采用这种方式是因为XML中存在重复,我担心在EntityManager中创建重复的实体。为了查看某个实体是否已经存在而进行的讨论意味着我可以更新现有实体而不是创建副本。现在有了我的新方法,每当我找到XML中表示的实体时,我就会将其拒绝成新的实体。当然,这会在EntityManager中创建重复,就像在XML中一样,但这可以在以后处理,希望......!
到目前为止,这被证明是一个更好的解决方案,尽管我在尝试使用$ em-> merge()合并EntityManager中的重复实体时遇到了一些问题。和cascade = {“persist”,“merge”}。我在这里发布了一个关于此的新问题:Doctrine 2.1 - Relation Lost After ManyToMany Cascade Merge - Symfony2
马修