需要一些帮助来将查询从createQuery()转换为queryBuilder()

时间:2012-03-27 14:58:21

标签: symfony doctrine-orm

我习惯用createQuery()而不是queryBuilder创建查询,但是我需要在queryBuilder中翻译一个查询,以便在EntityType中使用它来生成表单。这是我的疑问:

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');

有谁知道我应该改变它才能让它发挥作用?谢谢你的答案!

2 个答案:

答案 0 :(得分: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');

不确定我的关系是否正确,但你明白了......

答案 1 :(得分: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,因为它影响了生成器