2016-11-19 14 views
4

で定期的にオブジェクト間のプロキシオブジェクト、私は2つのクエリを持っています私が受け取った変数$objectはProxyオブジェクトを受け取ります。はDoctrine2私のSymfony2のコントローラでのgetResult

私が$objectsコレクションを出力し、各要素に対してフィールド、名前、フィールド1、フィールド2を含む出力を出力したい場合、このオブジェクトのフィールド2にはnullが返されます。実際に、これを他のコントローラと共に起動した場合、を取得すると、オブジェクトへの参照ごとにfield2もnullになります。例えば

Iのように、各オブジェクトを表示する場合は、:

name field1 field2 

Iは、$objectsに対して以下の配列を取得:

第三行は $objectある
nameExample field1Example field2Example 
nameExample field1Example field2Example 
nameExample field1Example 
nameExample field1Example field2Example 
nameExample field1Example field2Example 


最初のクエリでfield2を取得した場合、それは2番目のクエリのgetResultでも表示されます。しかし、それは私がEntityオブジェクトのために受け取ったすべてのフィールドをRequest全体で制御できるようにします。

  1. 私は間違っていましたか?
  2. どうすればその影響を避けることができますか?私はまだ多次元配列ではないオブジェクトを扱いたい(HYDRATE_ARRAY
  3. doctrineは常にプロキシオブジェクトではないエンティティオブジェクトを強制的に生成する方法はありますか?

ありがとうございます。

答えて

2

これは、Doctrineが返す各エンティティへの内部参照を保持するためです。以前にリクエストしたエンティティをリクエストすると、以前のオブジェクトが再利用されます。この理由は、同じエンティティの2つの異なるコピーを持つと、両方を操作しようとすると競合が発生するためです。詳細は、http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects

2つ目のクエリを実行する前に、最初に取得したエンティティ($em->detach($object)または$em->clear())を切り離す方法があります。 にご注意ください。まだ変更されていない変更はすべて削除されます。

別のオプションは、$em->refresh($object)を使用してエンティティを更新するかである(これは、それが完全にロードされるようになります)、または、それが2番目のクエリのためのすべてのエンティティを更新する必要が教義を教えて:

$query = $this->getDoctrine()->getManager()->createQuery('SELECT PARTIAL o.{id,name,field1, field2} FROM SomeBundle:SomeEntity o '); 
$query->setHint(Query::HINT_REFRESH, true); 
$objects = $query->getResult(); 

これはDoctrineのリフレッシュを行いますこの2番目のクエリで見つかったすべてのエンティティ

+0

ありがとうございました。以前は同様の解決策を検討していましたが、この問題は、1対多の関連付けを持つエンティティを他のエンティティに2回クエリすると、1つのクエリ例でも発生します。この場合、同じクエリー内にあるので、オブジェクトを切り離したりemをクリアすることはできません。あなたはそれについてどう思いますか? –

+0

「二度作った」というのはどういう意味ですか?エンティティBとの2つの異なる関連付けを持つエンティティAを持っていますか?(例えば、 'News'エンティティは' created_by'と 'updated_by'フィールドの両方が' User'エンティティを指しています)?そしてあなたは何とかそれらに 'PARTIAL'をロードしていますか? –

+0

私は、ここで説明した状況を意味しています:https://github.com/doctrine/doctrine2/issues/5731。実際、この問題はこのような関連性の変化に気づいているので十分正確ではありませんでした: 'A-> B →A。 –

関連する問題