Используя Symfony версии 3.0.9, у меня есть sql-запрос, который я преобразовал в dql следующим образом:
исходный запрос SQL:
SELECT
Product_Name,
Product_Code,
sum(quantity)AS quantity
FROM
ldr
GROUP BY
Product_Code,
Product_Name
исходный запрос с использованием Doctrine:
$query->select ( 'o.productName, o.productCode, sum(o.quantity) as quantity ' );
$query->from ( 'BillingBundle:Ldr', 'o' );
$query->add ( 'groupBy', 'o.productName, o.productCode');
Это отлично работает и дает мне список всех продуктов и количеств.
Теперь я хочу сделать подвыбор в предложении From, чтобы объединить все продукты, количество которых меньше 1%, в сегмент «Другое».
SQL для этого прост:
SELECT
case when quantity > (total * 0.01 ) then Product_Name else 'Other' end as name,
case when quantity > (total * 0.01 ) then Product_Code else 'Other' end as code,
sum(quantity)
FROM
(
SELECT
Product_Name,
Product_Code,
sum(quantity)AS quantity,
(SELECT sum(quantity) FROM ldr)AS total
FROM
ldr
GROUP BY
Product_Code,
Product_Name
)AS segments
GROUP BY
code,
name
Однако у меня возникли проблемы с выражением Sub-select в предложении From в Doctrine. Мой DQL (попытка):
$query->select ( 'case when sum(o.quantity) > (o.total * 0.01 ) then o.productName else :other end as name,
case when sum(o.quantity) > (o.total * 0.01 ) then o.productCode else :other end as code,
sum(o.quantity) as quantity ' );
$query->from ( ' (SELECT
l.Product_Name,
l.Product_Code,
sum(l.quantity)AS quantity,
(SELECT sum(ld.quantity) FROM BillingBundle:Ldr ld) AS total
FROM
BillingBundle:Ldr l
GROUP BY
l.Product_Code,
l.Product_Name )', 'o' );
$query->add ( 'groupBy', 'name, code');
$query->setParameter ( 'other', "Other" );
но я получаю сообщение об ошибке
Error: Class '(' is not defined.
Как правильно выразить подвыбор в From? Нужно ли мне использовать какой-нибудь подход RawSql?
Я не могу использовать addSelect(), потому что подзапрос находится в предложении From
Возможный дубликат Доктрина 2: как использовать столбец подзапроса (в предложении SELECT)
это не дубликат - в моем случае подзапрос находится в предложении FROM, поэтому addSelect() не будет работать.
Звучит как работа для необработанного SQL
@JasonRoman, похоже, ты прав. Как раздражает!
Вы должны делать это в своем коде приложения, я расскажу вам, как: сначала получить общую сумму от вашей сущности с помощью отдельного запроса, затем получить название продукта, код и количество, как во внутреннем запросе, как отдельный запрос от сущности, при этом показать результаты вы можете добавить условие в свой цикл, сравнив количество продукта с общим и указав название продукта или другое
когда вы говорите «должен» делать это в коде приложения, вы действительно имеете в виду «следует», например: это считается лучшей практикой, или вы имеете в виду «должен», потому что Doctrine, кажется, поддерживает только базовые структуры SQL? Как разработчику кажется очень плохой практикой писать циклы в моем коде приложения, где оператор SQL может выполнять эту работу.






Вы должны проверить addSelect (), как описано в этой теме stackoverflow.com/a/18164553/3986395