1

我正在使用 Symfony2 和 Doctrine 2.0。我正在尝试从 XML 提要中读取数据并将其映射到数据库中的新实体或现有实体。当 XML 提要中的数据发生更改时,我需要更新现有实体,但添加数据时,我应该创建新实体。

在我的实体类中,我使用以下非规范化方法将 XML 数据映射到实体的属性:

function denormalize(SerializerInterface $serializer, $data, $format = null) 

(在我的实体类中调用的 Symfony\Component\Serializer\Serializer 中定义)

此方法的文档声明“重要的是要了解 denormalize() 调用应该递归地对实现者的所有子对象进行非规范化。” 这就是我想要做的。但是实体不应该知道 EntityManager 那么我如何在 denormalize() 方法中检查相关/子实体是否已经存在?

亲切的问候,马修

4

2 回答 2

0

在实体中调用 EntityManager 确实是一个坏主意(据我所知,在控制器之外)。

我从来没有遇到过这个问题,但如果我是你,我会尝试在你的一个控制器中进行非规范化,或者如果它真的让你感到困扰,在你在控制器中调用的服务中,你给你的 EntityManager (同样,最好在控制器本身中执行此操作,或者只是将您的对象发送到服务,以便它可以将 xml 非规范化“放入”对象中)。

最好的方法是编写一个无论给定实体如何都可以工作的控制器。

希望有帮助!

于 2012-06-22T08:14:32.657 回答
0

我认为我的问题在于我的方法,而不是我的代码!

最初,每次我发现一个在 XML 中表示的实体时,我都会检查(使用 EntityManager)以查看它是新的还是现有的,然后再对其进行非规范化。我选择这条路线是因为 XML 中存在重复,而且我担心在 EntityManager 中创建重复的实体。检查一个实体是否已经存在意味着我可以更新现有实体而不是创建一个副本。现在,每当我发现一个以 XML 表示的实体时,我都会使用我的新方法将其去规范化为一个新实体。当然,这会在 EntityManager 中创建重复,就像在 XML 中一样,但这可以稍后处理,希望..!

到目前为止,这被证明是一个更好的解决方案,尽管我在尝试使用 $em->merge(); 合并 EntityManager 中的重复实体时遇到了一些问题;和级联= {“坚持”,“合并”}。我在这里发布了一个关于此的新问题:Doctrine 2.1 - Relation Lost After ManyToMany Cascade Merge - Symfony2

马修

于 2012-06-25T23:14:39.763 回答