私はDoctrine2を使用しており、このORMでクエリをflush()
実行する前にEntityManagerを自動SELECT
化して、アプリケーション内で常に一貫性を確保したいと考えています(このアプリケーションは多くの抽象化を行っているため、EntityManagerに関する知識は必要ありません。リポジトリ内)。
Doctrineでそれを行うオプションはありますか?
そうでない場合、これを簡単に実装するための戦略はありますか?
私はDoctrine2を使用しており、このORMでクエリをflush()
実行する前にEntityManagerを自動SELECT
化して、アプリケーション内で常に一貫性を確保したいと考えています(このアプリケーションは多くの抽象化を行っているため、EntityManagerに関する知識は必要ありません。リポジトリ内)。
Doctrineでそれを行うオプションはありますか?
そうでない場合、これを簡単に実装するための戦略はありますか?
すべての選択の前に、なぜフラッシュ (変更の書き込み) が必要なのですか? トランザクションの一貫性が必要になる可能性はありますか? つまり、挿入/更新は前の選択の結果に依存しますか? その場合、次のように明示的なトランザクションを使用することをお勧めします。
$em->transactional(function($em) {
$entity = $em->find('Entity', 123);
if ($entity->getValue() > 2)
{
$user = new User;
$user->setName('George');
$em->persist($user);
}
});
そうでない場合は、デフォルトの設定に固執し、unitOfWork を積み重ねて、ランタイムの終わりに向かって挿入/更新を最適化することをお勧めします。
これまでに見つけた唯一の解決策は、古いデータを返してはならないリポジトリ メソッドでクエリをflush()
発行する前に手動で行うことです。SELECT
class OrderRepository
{
public function findByUser(User $user)
{
$this->em->flush();
$query = $this->em->createQuery( ... );
// ...
}
}
このようにして、リポジトリを使用するサービスからフラッシュが隠されます。