web-dev-qa-db-ja.com

doctrineにデータベースからデータをリロードさせるにはどうすればよいですか?

Symfony2.1のインストールでdoctrine/mongodb 1.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) 

私は同じことを取得します。とにかく私は値のためにデータベースに戻る必要がありますか?

34
daSn0wie

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

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

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

代わりにfind()を使用して、内部プロキシキャッシュからドキュメントを取得します。 $dm->clear()メソッドを呼び出すまで、ドキュメントはプロキシキャッシュに残ります。

50
Madarco

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

$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);
26
fdellutri

前の答えに加えて、Entityではなく、Documentのデータベースを更新する方法を探していましたが、解決策は近かったです。私は同じ問題でこのページにつまずく他の人のためにここに投稿しています。

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

$em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => '[email protected]'));
echo "Old hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd

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

$user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('email' => '[email protected]'));
echo "New hash: ".$user->getPassword() . "\n";
// result: 8bb6118f8fd6935ad0876a3be34a717d32708ffd # Same !

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

そのため、解決策は2つのクエリの間に次を追加することでした。

$em->clear();

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

22
achedeuzot

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

$post; # modified
$entityManager->refresh();
$post; # reset from db
2
حمید

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

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

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

そして、あなたのPersonエンティティで、あなたの友人関係を必ず更新してください:

@ORM\OneToMany(targetEntity="Somewhere\PeopleBundle\Entity\Person", mappedBy="person", cascade={"detach"})
private $friends;
2
vbourdeix

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

$dm->getUnitOfWork()->clear('WGenSimschoolsBundle:Audit');
1
ryabenko-pro