Нужна помощь в переводе запроса из createQuery () в queryBuilder () - PullRequest
1 голос
/ 27 марта 2012

Я привык создавать запрос с помощью 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 ]

1 голос
/ 27 марта 2012

Когда вы запрашиваете БД с помощью:

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 голосов
/ 28 марта 2012

Мне в итоге удалось это сделать.Вот мой код:

$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, как ясделал, потому что это влияет на генерацию

...