doctrine2结果取决于先前的查询

时间:2014-06-12 09:00:41

标签: sql symfony doctrine-orm

我对doctrine2查询有一个奇怪的问题。

我的UniteRepository有两个方法:findA和findB(每个方法与几个左连接相似) 每个方法都返回我期望的结果。

但是如果我调用findA然后调用B,则findB返回false结果! 因此,以下代码是错误的,但如果我对第一行发表评论则很好:

    $a =  $this->getRepository('AcmeDemoBundle:Unite')->findA();
    $b =  $this->getRepository('AcmeDemoBundle:Unite')->findB();

    foreach ($b as $unite) {
        foreach ($unite->getEvaluations() as $evaluation) {
            echo $evaluation->getId();
        }
    }

findA和findB方法:

public function findA() {
      $q = $this->createQueryBuilder('u')
       ->select('u, fr, eus, pus, r, pvus, sg, sf, sm')       
       ->leftJoin('u.Evaluations','eus')   
         ->leftJoin('eus.FicheRisque','fr')                
         ->leftJoin('eus.Preconisations','pus')
         ->leftJoin('eus.Preventions','pvus')     
         ->leftJoin('eus.Reponses','r')
            ->leftJoin('r.SituationGravite','sg')
            ->leftJoin('r.SituationFrequence','sf')  
            ->leftJoin('r.SituationMaitrise','sm')    
       ->where('fr.actif = true and fr.isRPS = false and eus.resultat=1')
       ->orderby('fr.ordre');
       return $q->getQuery()->getResult();                             
  }       

 public function findB() {
      $q = $this->createQueryBuilder('u')
       ->select('u, fr, eus, pus, r, pvus')       
       ->leftJoin('u.Evaluations','eus')       
         ->leftJoin('eus.FicheRisque','fr')                
         ->leftJoin('eus.Preconisations','pus')
         ->leftJoin('eus.Preventions','pvus')     
         ->leftJoin('eus.Reponses','r')     
       ->where('fr.actif = true and fr.isRPS = true')
       ->orderby('fr.ordre');          
       return $q->getQuery()->getResult();                             
  }             

1 个答案:

答案 0 :(得分:0)

我发现自己的答案...... 学说使用身份地图模式(http://doctrine-orm.readthedocs.org/en/latest/reference/unitofwork.html#how-doctrine-keeps-track-of-objects

因此,为了提高性能,Doctrine将结果放入缓存中。

要解决这个问题,http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#entities-and-the-identity-map给了我这个(简单的)答案:

$em->clear();
相关问题