46

symfony2.1のインストールでdoctrine/mongodb1.0.0-BETA1を使用しています。

そのため、リポジトリがキャッシュしたオブジェクトを使用する代わりに、データベースからデータを呼び出すようにリポジトリを強制しようとしています。

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");

.... do something somewhere to change the object ....

この時点で私が電話すると

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");

監査データは変更されていません。最初にフェッチしたオブジェクトがまだあります。私がしようとすると

$dm->refresh($audit) 

私も同じことをします。とにかく、値を取得するためにデータベースに戻ることはできますか?

4

6 に答える 6

61

$auditオブジェクトへの変更をフラッシュしましたか?

$audit = $dm->getRepository("WGenSimschoolsBundle:Audit")->findOneById("xxxx");
//do something somewhere to change the object
$dm->flush();

を実行するたびに、findBy(...)またはfindOneBy(...)実際にDBから新しいドキュメントをフェッチします。(Symfonyプロファイラーにクエリが表示されるはずです)

代わりにfind()を使用すると、内部プロキシキャッシュからドキュメントがフェッチされます。メソッドを呼び出すまで、ドキュメントはプロキシキャッシュに残ります$dm->clear()

于 2013-04-29T09:34:15.393 に答える
42

これは私のために働いた:

$doc = $this->documentManager->getRepository('MyBundle:MyDoc')->find($id);

/* ... in the meanwhile another external process is doing some changes to the object ...*/
$doc = $this->documentManager->getRepository('MyBundle:MyDoc')->find($id); // Perhaps this is not useful
$this->documentManager->refresh($doc);
于 2013-03-28T17:24:13.750 に答える
27

以前の回答に加えて、データベースを更新する方法を探していEntityましたDocumentが、ソリューションは近いものでした。同じ問題でこのページにつまずいた他の人のために、ここに投稿しています。

私の機能テストの1つでは、同じクエリを2回使用していました。

$em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => 'james.bond@secure.gov.co.uk'));
echo "Old hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd

次に、テストはパスワードを変更するプロセスを通過します。次に、同じクエリでパスワードハッシュが変更されたかどうかを比較するために、ユーザーに再クエリを実行しました。

$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => 'james.bond@secure.gov.co.uk'));
echo "New hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd # Same !

問題は、テストされたコントローラーがハッシュを更新したにもかかわらず、エンティティマネージャーがエンティティをキャッシュに持っていたことでした。

したがって、解決策は、2つのクエリの間に以下を追加することでした。

$em->clear();

そして今、パスワードハッシュはクエリ間で変更されました!わーい !

于 2014-04-17T10:04:11.963 に答える
8

メソッドrefreshを使用できます:

$post; # modified
$entityManager->refresh();
$post; # reset from db
于 2017-03-19T21:58:42.947 に答える
3

関連エンティティを処理するときに、関連エンティティを変更して親オブジェクトを介して保存する場合、デタッチを有効にするには、オプションcascade={"detach"}を追加する必要があります。

たとえば、PersonオブジェクトのFriendsのリストを更新する場合、リストに新しいオブジェクトを追加し、それらの一部を削除して、既存のオブジェクトの一部を更新するとします。あなたは持っているつもりです

$em->flush();
$em->detach($entity);

そして、あなたの個人エンティティで、あなたの友達の関係を更新することを忘れないでください:

@ORM\OneToMany(targetEntity="Somewhere\PeopleBundle\Entity\Person", mappedBy="person", cascade={"detach"})
private $friends;
于 2014-03-31T09:53:58.233 に答える
1

次のようなものを試してください

$dm->getUnitOfWork()->clear('WGenSimschoolsBundle:Audit');
于 2013-02-10T13:37:23.893 に答える