1

私はSymfony2とDoctrine2.0を使用しています。XMLフィードからデータを読み取り、これをデータベース内の新規または既存のエンティティにマップしようとしています。XMLフィードのデータが変更された場合、既存のエンティティを更新する必要がありますが、データが追加された場合は、新しいエンティティを作成する必要があります。

私のエンティティクラスでは、次の非正規化メソッドを使用して、XMLデータをエンティティのプロパティにマップしています。

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

(Symfony \ Component \ Serializer \ Serializerで定義され、エンティティクラス内で呼び出されます)

このメソッドのドキュメントには、「denormalize()呼び出しは、実装者のすべての子オブジェクトを再帰的に非正規化する必要があることを理解することが重要です」と記載されています。これが私がやろうとしていることです。ただし、エンティティはEntityManagerについて知らないはずなので、denormalize()メソッド内で、関連する/子エンティティがすでに存在するかどうかを確認するにはどうすればよいですか?

よろしく、マシュー

4

2 に答える 2

0

エンティティ内で(そして、私が知る限り、コントローラーの外部で)EntityManagerを呼び出すことは確かに悪い考えです。

私はその問題に直面したことはありませんが、もし私があなたなら、コントローラーの1つで非正規化しようとします。それが本当に気になる場合は、コントローラーで呼び出し、EntityManager(ここでも、コントローラー自体でそれを行うか、単にオブジェクトをサービスに送信して、xmlをオブジェクトの「中に」非正規化できるようにするのが最善です)。

与えられたエンティティに関係なく機能するコントローラーを作成するのが最善です。

お役に立てば幸いです。

于 2012-06-22T08:14:32.657 に答える
0

私の問題は私のアプローチにあり、実際には私のコードではないと思います!!

元々、XMLで表されるエンティティを見つけるたびに、(EntityManagerを使用して)非正規化する前に、エンティティが新規か既存かを確認していました。XMLに重複があり、EntityManagerで重複エンティティが作成されるのではないかと心配したため、このルートを採用しました。エンティティがすでに存在するかどうかを確認することは、複製を作成するのではなく、既存のエンティティを更新できることを意味しました。これで、XMLで表されるエンティティを見つけるたびに新しいアプローチを使用して、それを新しいエンティティに非正規化します。もちろん、これにより、XMLの場合と同様に、EntityManagerで重複が発生しますが、後で処理できることを願っています。

これまでのところ、これはより良い解決策であることが証明されていますが、$ em-> merge()を使用してEntityManagerで重複するエンティティをマージしようとすると、いくつかの問題が発生します。およびcascade={"persist"、"merge"}。私はこれについての新しい質問をここに投稿しました:Doctrine2.1-ManyToManyカスケードマージ後に失われた関係-Symfony2

マシュー

于 2012-06-25T23:14:39.763 に答える