web-dev-qa-db-ja.com

Doctrine entitymanager clearが完全にクリアされない

私はこのコードを持っています:

_$entityManager->clear('Reza\MyBundle\Entity\ListItem');

$identity = $entityManager->getUnitOfWork()->getIdentityMap();
foreach ($identity as $class => $objectlist) {
    if ($class == 'Reza\MyBundle\Entity\ListItem') {
        print "didn't fully clear, exiting..\n ";
        exit;
    }
}
_

クリアするためにクラス名を渡した後は、それらのオブジェクトが作業単位に表示されないはずだと思うかもしれませんが、ソースを見ると、clear()関数に引数を渡すと、 it デタッチのみそのタイプのエンティティ。一方、clear()に引数を渡さない場合、デタッチして実際にはクリアされるため、上記のコードは138行目にヒットせず、終了します。つまり、すべてのエンティティを切り離すだけでなく、作業単位もクリアします。

誰かこれについて何か考えがありますか? doctrineにバグを報告する必要がありますか?

16
Reza S

ドキュメントで説明されているようにclear()は機能するため、技術的にはバグではないと言えるでしょう。Doctrine2 [〜#〜] api [〜#〜]documentationを参照してください および ソースコード現在のバージョン )。

clear()メソッドは、すべてのエンティティまたは指定したタイプのエンティティをdetach()する方法にすぎません。これは「マルチデタッチ」と考えることができ、その目的は分離を超えて拡張されません。

clear()を使用してすべてのエンティティをデタッチするときDoctrineは、可能な限り最も効率的な方法を使用してエンティティをデタッチします。このプロセスでは、IDマップ配列は空のarray()に設定されます。これは、あなたが言及していると私が信じているものを明確にしたように見せます。

$entityManager->clear();
$identity = $entityManager->getUnitOfWork()->getIdentityMap(); 
//This will return a an empty array() to $identity
//therefore $identity['Reza\MyBundle\Entity\ListItem'] would be undefined

Reza\MyBundle\Entity\ListItemのエンティティのデータが取得されたと仮定します。次に、次の例では、作業ユニットに少なくとも1つのReza\MyBundle\Entity\ListItemオブジェクトがあることがわかります。

$identity = $entityManager->getUnitOfWork()->getIdentityMap();
$count = count($identity['Reza\MyBundle\Entity\ListItem']);
// $count would be > 0;

ただし、clear($entityName)を使用し、エンティティタイプでクリアすると、クリア/分離されたエンティティは作業ユニットから削除されます。残っているのは配列キー[$entityName]のみで、オブジェクトは残りません。

$entityManager->clear('Reza\MyBundle\Entity\ListItem');
$identity = $entityManager->getUnitOfWork()->getIdentityMap(); 
$count = count($identity['Reza\MyBundle\Entity\ListItem']);
//$count would be == 0. All Objects cleared/detached.

この機能は、ドキュメントで指定されているすべてです。

機能のリクエストは、より一貫して機能させるために必要だと思います。 clear($entityName)を呼び出すと、Doctrineは残りのキーをunset()にする必要があるため、未定義(クリア)になります。これにより、次のように機能するコードをより簡単に記述できます。 clear()またはclear($entityName)を使用しました。

37
hcoat