Доктрина - подвыбор в From

Используя 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

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

Simas Joneliunas 29.06.2018 03:43

это не дубликат - в моем случае подзапрос находится в предложении FROM, поэтому addSelect() не будет работать.

Black 29.06.2018 08:30

Звучит как работа для необработанного SQL

Jason Roman 29.06.2018 10:11

@JasonRoman, похоже, ты прав. Как раздражает!

Black 29.06.2018 15:38

Вы должны делать это в своем коде приложения, я расскажу вам, как: сначала получить общую сумму от вашей сущности с помощью отдельного запроса, затем получить название продукта, код и количество, как во внутреннем запросе, как отдельный запрос от сущности, при этом показать результаты вы можете добавить условие в свой цикл, сравнив количество продукта с общим и указав название продукта или другое

M Khalid Junaid 29.06.2018 20:54

когда вы говорите «должен» делать это в коде приложения, вы действительно имеете в виду «следует», например: это считается лучшей практикой, или вы имеете в виду «должен», потому что Doctrine, кажется, поддерживает только базовые структуры SQL? Как разработчику кажется очень плохой практикой писать циклы в моем коде приложения, где оператор SQL может выполнять эту работу.

Black 30.06.2018 00:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
120
0

Другие вопросы по теме