2016-08-06 11 views
2

私は3つの教義の実体を持っています。 1つはUser、2番目はProduct、3番目はProductUsersです。Doctrine2のOneToMany/ManyToOne関連の深さ/ループを制限する方法は?

ので、UserProductUsersと同じProductOneToMany関連がProductUsersとOneToMany関連を持っています。 ProductUsersは、UserProductの両方に関連付けられたManyToOneを持っています。ように:

ユーザーは複数の製品を使用でき、製品には複数のユーザーが参加できます。 ProductUsersには、単に関係以外の関係に関するいくつかの追加情報があります。

問題は、Userオブジェクトを1つフェッチするときに、それに関連付けられたProductUsersが付属しており、それにはProductが関連付けられています。それだけでなく、Productには、すべてProductUsersというものが付属していて、かなりのオーバーヘッドであるUserのオブジェクトです。

This質問は私の問題に密接に関連しています。

私はdoctrineレベルで、JMSSerializerBundle MaxDepthのように制限することを検討しています。教義におけるそのようなオーバーヘッドを制限する方法はありますか?

+0

これはDoctrineが動作する方法です。取得するコレクションは、実際のデータがDBからフェッチされる基になるデータにアクセスする場合にのみ、レイジーコレクションにする必要があります。デフォルトでは、ユーザーをフェッチするときにSELECT * FROMユーザーのクエリのみが実行されます。一度にレコードをフェッチするには、ORM Query Selectでそれらを結合する必要があります。$ qb-> select( 'u'、 'up') – mblaettermann

答えて

2

私は長い間この問題に直面しました。私はlazy loadingを試しました。どちらが期待どおりに動作せず、それは私の問題の適切な解決策ではありませんでした。だから私はいくつかのR & Dをして、私はbidirectionalの関係がProductからProductUsersの関係を必要としないという解決策を思いついた。

unidirectionalと同じ関係を管理できるのは、ProductUsers側からです。 cascade-persistまたは類似の機能が必要な場合は、One-To-Manyアソシエーションが必要です。私はこれについてもsmall blogと書いています。

あなたの解決策としては、からProductUserの両方のエンティティを持つMany-To-Oneの関連付けを持つだけです。データベースの関連付けを変更する必要はありません。

1人のユーザーに関連付けられた製品が必要な場合は、関連するデータが必要なときにいつでもQuerybuilderをリポジトリに保存して使用できます。

これは、多くのパフォーマンスを節約します。それが役に立てば幸い!

+0

ありがとう@Jeet!現在、私は 'DQL'で問題を解決して、必要なものだけを取得しています。また、製品ユーザーのリストが必要な場合や、その逆の場合にもOneToManyが必要ですが、それはここで問題を作り出しているので、カスタムクエリが行く方法です。 'OneToMany'はほとんど役に立たない:( – Mehulkumar

関連する問題