1

PartyContact への 1 対多の双方向関連付けを持つエンティティー Party があります。オブジェクト ハイドレーションを使用しているときに、フィルタリングされた PartyContact コレクションを返す DQL ステートメントを作成しようとしています。配列のハイドレーションを使用して目的の結果を返すことができますが、純粋なオブジェクトのハイドレーションを返そうとすると、コレクション全体を受け取ります。

Party (ID 1) に関連付けられた PartyContact インスタンスは合計 5 つあり、この Party インスタンスに関連付けられた 5 つの PartyContact インスタンスのうち 3 つには、値が type という名前のプロパティがあります。PartyContact::TYPE_HOME; したがって、Party を返すことができるはずです。 3 つの PartyContact インスタンスのフィルター処理されたコレクションを持つインスタンス。

過去に、エンティティのコレクションのフィルタリングを処理するために、イベント リスナー、クロージャー、またはフィルター イテレーターを使用しました。パフォーマンスに関しては、これは少し多いようです。Doctrine 2.2 の新しいフィルターを認識していますが、リポジトリの DQL でこれを処理できるようにしたいと考えています。

参考までに、私は 2.2.0-BETA2 を使用しています (注: これを確認したところ、2.2.2 がリリースされていることがわかっているので、今すぐ試してみます)

私は次のdqlを持っています:

$query = $this->_em->createQuery("SELECT p, c FROM Test\Party p LEFT JOIN p.contactMechanisms c WITH c.type = :type WHERE p.id = :id");
$query->setParameter('type', PartyContact::TYPE_HOME);
$query->setParameter('id', 1);
$query->setFetchMode("Test\Party", "contactMechanisms", "EAGER");
$results = $query->getResult(Query::HYDRATE_ARRAY);
$party = $results[0];

私の結果は次のとおりです。

  • Query::getResult(Query::HYDRATE_ARRAY) を使用する場合:
count($party['contactMechanisms']) = 3
  • Query::getResult(Query::HYDRATE_ARRAY) を使用する場合:
$party->getContactMechanisms()->count() = 5
4

0 に答える 0