2012-03-27 66 views
1

我用createQuery()而不是queryBuilder创建查询,但是我需要在查询生成器中转换查询,以便在EntityType中生成表单。这里是我的查询:需要一些帮助将查询从createQuery()转换为queryBuilder()

SELECT p FROM D2ECoreBundle:Player p, 
D2ECoreBundle:LadderMatch lm, 
D2ECoreBundle:PlayerComposition hpc 
JOIN hpc.players hp, 
D2ECoreBundle:PlayerComposition fpc 
JOIN fpc.players fp 
WHERE (lm.homePlayerComposition = hpc AND hp = p) 
OR (lm.foreignPlayerComposition = fpc AND fp = p) 

和这里是我认为这将是在QueryBuilder的,但不工作:

$qb->select('p') 
->from('D2ECoreBundle:Player', 'p') 
->from('D2ECoreBundle:LadderMatch', 'lm') 
->from('D2ECoreBundle:PlayerComposition', 'hpc') 
->join('hpc.players', 'hp') 
->from('D2ECoreBundle:PlayerComposition', 'fpc') 
->join('fpc.players', 'fp') 
->where('lm.homePlayerComposition = hpc' AND 'hp = p') 
->orwhere('lm.foreignPlayerComposition = fpc' AND 'fp = p'); 

有谁知道我应该改变已经工作?感谢您的答案!

回答

0

我最终设法做到了这一点。这里是我的代码:

$qb = $this->createQueryBuilder('lm') 
    ->select('p') 
    ->from('D2ECoreBundle:Player', 'p') 
    ->join('lm.homePlayerComposition', 'hpc') 
    ->join('hpc.players', 'hp') 
    ->join('lm.foreignPlayerComposition', 'fpc') 
    ->join('fpc.players', 'fp') 
    ->where('lm.homePlayerComposition = hpc AND hp = p') 
    ->orwhere('lm.foreignPlayerComposition = fpc AND fp = p'); 
return $qb; 

而且非常重要的事情,因为我要选择的球员,但由LadderMatch实体开始,我需要把这个LadderMatchRepository.php而不是PlayerRepository.php像我一样,因为它会影响基因组

1

当你查询数据库有:

SELECT * FROM TableA T1, TableB T2 .... 

在许多实现是一样的:

SELECT * FROM TableA T1 JOIN TableB T2 ON ... // this is INNER JOIN 

所以,而是采用from多次,做joins

$qb->select('p') 
->from('D2ECoreBundle:Player', 'p') 
->join('p.ladderMatches', 'lm') 
->join('p.playerComposition', 'hpc') 
->join('hpc.players', 'hp') 
->join('hp.playerCompossition', 'fpc') 
->join('fpc.players', 'fp') 
->where('lm.homePlayerComposition = hpc' AND 'hp = p') 
->orwhere('lm.foreignPlayerComposition = fpc' AND 'fp = p'); 

不知道如果我得到的关系正确,但你明白了...

+0

玩家不包含LadderMatch,这就是问题所在。但是,我得到我的一个mystakes。梯队比赛2球员组合(Home et Foreign)和球员组合包含球员。但我只是想要玩家! – copndz 2012-03-27 16:17:00