あなたがここでしていることは壊れています:
SELECT
u, p
FROM
User u
JOIN
u.posts p
WITH
p.isFlagged = true
これにより、 `User#posts"コレクションが間違った値でハイドレイトされ、ロジックが壊れたり、オブジェクトグラフが壊れたり、すべてが壊れたりします。
次のようなものを使用して、DQLレベルでこれを解決する必要があります。
SELECT
u, p
FROM
User u
JOIN
u.posts p
JOIN
u.posts j
WITH
j.isFlagged = true
これにより、基本的に、中間(壊れた)状態なしで、ユーザーオブジェクト内の正しい投稿コレクションがハイドレイトされます。
編集:私は@Athlanの答えに基づいて考えたので、質問を誤解しました。これは根本的に間違っています(壊れたコレクションをフラッシュするのは本当に間違っています)。これは私の以前の答えであり、問題を解決するので興味深いと思いますが、実際には正しい方法ではありません。
この質問は、ORMが期待どおりにコレクションを更新したかどうかを実際に知りたくなりました。
私はこのブランチでテストを書きました。
基本的に、あなたがする必要があるのは単純です:
$entityManager->refresh($entity);
テストの関連部分は次のとおりです。
$foo = new DDC2666Foo();
$this->_em->persist($foo);
$this->_em->flush();
$this->_em->clear();
$fetchedFoo = $this->_em->find(__NAMESPACE__ . '\DDC2666Foo', $foo->id);
$fetchedFoo->bars->add(new DDC2666Bar());
$this->assertCount(1, $fetchedFoo->bars);
$this->_em->refresh($fetchedFoo);
$this->assertCount(0, $fetchedFoo->bars, 'The collection was reset');
これによってエンティティも再フェッチされるという欠点がありますが、ORM自体は単一のコレクションを更新するためのファサードを提供しません。
とにかく、これも良いことです。この方法では、カプセル化が破られず、コードで予期しない(そしてデバッグが難しい)動作が発生する可能性があります。