Doctrine Результаты COALESCE, SUM и Subtract в синтаксической ошибке: ожидаемая доктрина \ ORM \ Query \ Lexer :: T_FROM, полученная '-' - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь вычесть 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) возвращает ноль, у меня возникает та же проблема. Какой правильный синтаксис для того, чего я хочу достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...