Синтаксис doctrine queryBuilder addSelect

Я поддерживаю приложение Symfony 2.2, и мне нужно изменить некоторые запросы, чтобы исправить проблему округления. Мы используем Doctrine ORM и queryBuilder для работы с базой данных. Вот пример кода:

$qb = $this->createQueryBuilder($alias);
$qb->join('t.store', 'store')
   ->addSelect('w')
   ->leftJoin('t.lines', 'l', 'WITH',
       $qb->expr()->andX(
         $qb->expr()->eq('l.rejected', 0)
       )
    )
    // WRONG  ->addSelect('SUM(l.price * l.amount * (1 + l.tax + l.retax)) AS total')
   ->leftJoin('t.warns','w')->groupBy('t')->addGroupBy('w')
   ->orderBy('t.id', 'DESC');

Мне нужно изменить прокомментированную строку (начиная с // НЕПРАВИЛЬНО), чтобы она применила пару округлений к налогам, поэтому она должна быть:

->addSelect('SUM(l.price * l.amount) + 
             ROUND(l.price * l.amount * l.tax, 2) + 
             ROUND(l.price * l.amount * l.retax, 2) AS total')

Когда я запускаю приложение, оно выдает внутреннюю ошибку сервера 500. Если я удалю функцию «ОКРУГЛ.», Она будет работать (но не будет правильно округлять).

РЕДАКТИРОВАТЬ По запросу, вот раздел doctrine файла config.yml:

# Doctrine Configuration
doctrine:
    dbal:
        default_connection:   default
        connections:
        default:
            driver:   %database_driver%
            host:     %database_host%
            port:     %database_port%
            dbname:   %database_name%
            user:     %database_user%
            password: %database_password%
            charset:  UTF8

    orm:
        auto_generate_proxy_classes: %kernel.debug%
        entity_managers:
            default:
                auto_mapping: true
                mappings:
                    gedmo_tree:
                        type: annotation
                        prefix: Gedmo\Tree\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity"
                        alias: GedmoTree 
                        is_bundle: false

                    gedmo_loggable:
                        type: annotation
                        prefix: Gedmo\Loggable\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity"
                        alias: GedmoLoggable 
                        is_bundle: false
                dql:
                    numeric_functions:
                        round: DoctrineExtensions\Query\Mysql\Round

Что с этим не так? Заранее спасибо,

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
1 829
1

Ответы 1

Функция ROUND недоступна "из коробки". Помните, что хотя в ROUND есть функция SQL, здесь вы имеете дело с DQL.

Один из способов преодолеть это - установить doctrine-extensions, который предоставляет множество функций DQL, включая ROUND. В качестве альтернативы вы можете установить пакет StofDoctrineExtensionsBundle, который позаботится о настройке этих функций.

Надеюсь это поможет...

ОБНОВИТЬ:

  1. Установите beberlei/DoctrineExtensions. Как указано в README репозитория, он представляет собой «Набор расширений для Doctrine 2, которые добавляют поддержку функций, доступных в MySQL, Oracle, PostgreSQL и SQLite.». Полный список функций быстро показывает, что ROUND включен.

  2. Зарегистрируйте функцию. Есть действительно хороший Официальные документы Symfony по теме. Например:

    # config/packages/doctrine.yaml
    doctrine:
        orm:
            # ...
            dql:
                numeric_functions:
                    round: DoctrineExtensions\Query\Mysql\Round
    

Я вижу, что в приложении установлены «расширения доктрины gedmo». Кроме того, в app/config/config.yml я вижу 2 сопоставления gedmo (gedmo_tree и gedmo_loggable) под ключом «doctrine / orm». Не могли бы вы помочь мне с тем, что мне нужно добавить для поддержки функции ROUND в DQL? Спасибо!

Fel 14.08.2018 12:17

Извините, я сделал ошибку при копировании и вставке URL. Кажется, что gedmo не имеет набора кросс-платформенной функции DQL, но вместо этого beberlei/DoctrineExtensions имеет. Обновляю ответ ...

Jovan Perovic 14.08.2018 12:35

Здравствуй! Я только что понял, что в приложении также установлен StofDoctrineExtensionsBundle в разделе vendor / stof / doctrine-extensions-bundle. Я немного исследую, смогу ли я найти то, что мне нужно. Спасибо за ваше время.

Fel 14.08.2018 12:39

Да, я ошибся. Расширения gedmo - это расширения, основанные на поведении, а не на функциях.

Jovan Perovic 14.08.2018 12:45

Извините за вопрос новичка (я новичок в Symfony): мне нужно запускать какую-то команду или что-то делать, когда я изменяю файл config.yml?

Fel 14.08.2018 13:22

Предполагая, что вы пытаетесь загрузить среду dev, я так не думаю, нет. Для prod вам потребуется cache:clear. Вы получаете ошибку?

Jovan Perovic 14.08.2018 13:24

Да, у меня внутренняя ошибка сервера 500. Я обновлюсь, когда найду причину.

Fel 14.08.2018 13:38

Все еще не работает ... Разве в строке функционального регистра в config.yml не должно быть что-то вроде «Beberlei»? Я имею ввиду: round: Beberlei\DoctrineExtensions\Query\Mysql\Round или что-то в этом роде?

Fel 14.08.2018 14:58

По мнению исходный код, это не так. Какую ошибку вы видите на самом деле? HTTP 500 Internal error - это prod, говорящий, что что-то перевернулось, но что говорит dev?

Jovan Perovic 14.08.2018 19:22

Здравствуй! Извините, у нас был выходной, и я не пришла на работу. Это ошибка, которую выдает приложение: [2018-08-16 13:20:26] request.CRITICAL: Uncaught PHP Exception Doctrine\ORM\Query\QueryException: "[Syntax Error] line 0, col 68: Error: Expected known function, got 'ROUND'" at /isp/www/docs/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Que‌​ryException.. Кажется, что он не загружает функцию ROUND из DoctrineExtensions ...

Fel 16.08.2018 13:22

странно ... не могли бы вы обновить свой вопрос с помощью раздела doctrine в config.yml?

Jovan Perovic 16.08.2018 14:33

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