我对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();
}
答案 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();