Я пытаюсь сделать это с помощью querybuilder и DQL без успеха. Как кажется, DQL не разрешает операции с подзапросами в SELECT. То, что я достиг до сих пор:
$subQuery = $em->createQueryBuilder('m')
->select("SUM(m.value)")
->where("m.year = 2000")
->getDQL();
Следующий запрос работает, хотя и не вычислить процент:
$query = $em->createQueryBuilder('f')
->select("f.field")
->addSelect(sprintf('(%s) AS total', $subQuery))
->addSelect('(SUM(f.value)*100) AS percentage')
->where("f.year = 2000")
->groupBy("f.field")
->getQuery()
->getResult();
Однако, если вы пытаетесь добавить подразделение в избранных для того, чтобы получить процент и вы используете подзапрос, он просто не работает. Похоже, что в DQL это не разрешено. Я пробовал с псевдонимом и с подзапросом напрямую, и ни один из них не работал.
Не работает:
$query = $em->createQueryBuilder('f')
->select("f.field")
->addSelect(sprintf('(%s) AS total', $subQuery))
->addSelect('(SUM(f.value)*100)/total AS percentage')
->where("f.year = 2000")
->groupBy("f.field")
->getQuery()
->getResult();
Не работает либо:
$query = $em->createQueryBuilder('f')
->select("f.field")
->addSelect(sprintf('(SUM(f.value)*100)/(%s) AS percentage', $subQuery))
->where("f.year = 2000")
->groupBy("f.field")
->getQuery()
->getResult();
Я предложил бы использовать SQL непосредственно (Учение это позволяет). Использование собственных запросов sql и сопоставление результатов могли бы сделать трюк. В этом нет недостатка.
Documentation
Если вы нашли способ сделать это с помощью QueryBuilder или DQL, пожалуйста, дайте мне знать.
Надеюсь, это поможет.