1

序文: 私のスクリプトは少し複雑なので、複雑さを単純な例に落とし込もうとしています。

エンティティ「会社」があるとします。次のようなリポジトリ関数もあります。

public function delete(){

    // get company-objects to delete
    [...]

    // delete some companies
    $this->getEntityManager()->remove($company1);
    $this->getEntityManager()->remove($company2);

    // do other things
    [...]

    // get companies via createQuery (I really need to do it via 
    // createQuery because of different reasons that would be too
    // complicated to explain for this problem)
    $query = $this->getEntityManager()
                    ->createQuery('
                        SELECT company
                        FROM MyOwnBundle:Company company
                        WHERE [...irrelevant...]
                    ');
    $companies = $query->getResult();
    dump($companies);
    exit;
}

問題: createQuery は削除された会社も選択します。

私の考え:

  • entityManager は会社が削除されたことを知っているため、クエリでそれらを選択しないと思いました。しかし、この考えは間違っていました... (しかし、これはなぜですか? entityManager はグローバルなシングルトン オブジェクトではありませんか?)
  • createQuery を使用する前に flush() でデータを永続化すると、結果がうまくいくことはわかっています。しかし、プロセス全体がトランザクションに含まれないため、ここでデータを永続化することはできません。
  • また、createQuery の where-part を操作して既に削除された会社を除外することもできません。これは、プロセス全体が多くの機能に分割されており、削除された会社を含む配列をプロセス全体で転送するのが難しいためです。

質問: 削除された企業を除いて、createQuery を介して企業を取得するにはどうすればよいですか?

4

1 に答える 1

0

以下のようにコードをラップして、プロセス全体をトランザクションにすることができます。このようにして、データを削除した直後にフラッシュできます。

$this->getEntityManager()->transactional(function($em) {
   // put your code here
   // $em is instanceof EntityManager
});
于 2015-09-11T09:42:02.653 に答える