Doctrine DQL-запрос с суммой подзапросов - PullRequest
0 голосов
/ 06 ноября 2019

Следующий DQL-запрос Doctrine возвращает синтаксическую ошибку:

    return $this->getEntityManager()->createQuery(
        'SELECT i invoice, (
            (SELECT SUM(p1.amount) FROM PaymentTableA p1 WHERE p1.invoice = i.id)
            +
            (SELECT SUM(p2.amount) FROM PaymentTable2 p2 WHERE p2.invoice = i.id)
        ) mySUM            
        FROM Invoice i
        WHERE i.id BETWEEN 1 AND 50'
    )->getResult();

enter image description here

Мне нужна «простая» сумма из 2 подзапросов, напримерэто действительное утверждение MySQL

select i.*, (
  (select sum(p1.amount) from PaymentTable1 p1 where p1.invoice_id = i.id)
  +  
  (select sum(p2.amount) from PaymentTable2 p2 where p2.invoice_id = i.id)
) mySUM            
from Invoice i
where i.id between 1 and 50;

Как я могу сделать это с DQL?

1 Ответ

0 голосов
/ 09 ноября 2019

К сожалению, синтаксический анализатор доктрины не может объединить 2 подвыбора в 1 вычисляемое поле.

Ваш лучший вариант - разделить подвыборы :

return $this->getEntityManager()->createQuery(
    'SELECT i invoice,
        (SELECT SUM(p1.amount) FROM PaymentTableA p1 
                    WHERE p1.invoice = i.id) AS sum1
        (SELECT SUM(p2.amount) FROM PaymentTable2 p2 
                    WHERE p2.invoice = i.id) As sum2
    FROM Invoice i
    WHERE i.id BETWEEN 1 AND 50'
)->getResult();

и объединитьполучено 2 суммы.

В качестве альтернативы вы можете переписать запрос и использовать 2 JOIN с "PaymentTableA p1" и "PaymentTable2 p2":

SELECT i invoice,
    SUM(p1.amount) + SUM(p2.amount) AS MySum
FROM Invoice i
JOIN PaymentTableA p1 WITH p1.invoice = i.id
JOIN PaymentTable2 p2 WITH p2.invoice = i.id
WHERE i.id BETWEEN 1 AND 50
GROUP BY i.id
...