Я пытаюсь вычесть SUM
двух полей друг из друга. Поэтому мне нужно использовать COALESCE
, потому что когда нет результатов в одном поле, SUM
возвращает ноль для обоих. Однако этот указанный c запрос, по-видимому, возвращает синтаксическую ошибку:
TagGroup
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\TagGroupRepository")
* @ORM\Table(name="tag_group")
*/
class TagGroup
{
...
/**
* The collection of $votes that this tag group has
* @var ArrayCollection $votes
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Vote\TagVote", cascade={ "persist", "remove"}, mappedBy="tagGroup")
*/
private $votes;
/**
* The collection of $rewards that this tag group has
* @var ArrayCollection $votes
* @ORM\OneToMany(targetEntity="AppBundle\Entity\Tag\TagGroupReward", cascade={ "persist", "remove"}, mappedBy="tagGroup")
*/
private $rewards;
..
}
TagGroupRepository
$qb = $this->createQueryBuilder("tg")
->select('COALESCE(SUM(ve.amountYp), 0) - COALESCE(SUM(r.amountYp), 0)')
->leftJoin('tg.votes', 'v')
->leftJoin('tg.rewards', 'r')
->leftJoin('v.entries', 've')
->where("tg.id = :tagGroupId")
->setParameter("tagGroupId", $group->getId());
Ошибка [0]: [Синтаксическая ошибка], строка 0, столбец 37: Ошибка: ожидаемый Doctrine \ ORM \ Query \ Lexer :: T_FROM, полученный '-' в файле / Applications / MAMP / htdocs / sites / yoors / vendor / doctrine / orm / lib / Doctrine / ORM / Query / QueryException. php в строке 54 [] []
Однако, если я удаляю первое COALESCE
, запрос работает. Обратите внимание:
$qb = $this->createQueryBuilder("tg")
->select('SUM(ve.amountYp) - COALESCE(SUM(r.amountYp), 0)')
->leftJoin('tg.votes', 'v')
->leftJoin('tg.rewards', 'r')
->leftJoin('v.entries', 've')
->where("tg.id = :tagGroupId")
->setParameter("tagGroupId", $group->getId());
Этого мне недостаточно, потому что когда SUM(ve.amountYp)
возвращает ноль, у меня возникает та же проблема. Какой правильный синтаксис для того, чего я хочу достичь?