Я поддерживаю приложение 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
Что с этим не так? Заранее спасибо,




Функция ROUND недоступна "из коробки". Помните, что хотя в ROUND есть функция SQL, здесь вы имеете дело с DQL.
Один из способов преодолеть это - установить doctrine-extensions, который предоставляет множество функций DQL, включая ROUND. В качестве альтернативы вы можете установить пакет StofDoctrineExtensionsBundle, который позаботится о настройке этих функций.
Надеюсь это поможет...
Установите beberlei/DoctrineExtensions. Как указано в README репозитория, он представляет собой «Набор расширений для Doctrine 2, которые добавляют поддержку функций, доступных в MySQL, Oracle, PostgreSQL и SQLite.». Полный список функций быстро показывает, что ROUND включен.
Зарегистрируйте функцию. Есть действительно хороший Официальные документы Symfony по теме. Например:
# config/packages/doctrine.yaml
doctrine:
orm:
# ...
dql:
numeric_functions:
round: DoctrineExtensions\Query\Mysql\Round
Извините, я сделал ошибку при копировании и вставке URL. Кажется, что gedmo не имеет набора кросс-платформенной функции DQL, но вместо этого beberlei/DoctrineExtensions имеет. Обновляю ответ ...
Здравствуй! Я только что понял, что в приложении также установлен StofDoctrineExtensionsBundle в разделе vendor / stof / doctrine-extensions-bundle. Я немного исследую, смогу ли я найти то, что мне нужно. Спасибо за ваше время.
Да, я ошибся. Расширения gedmo - это расширения, основанные на поведении, а не на функциях.
Извините за вопрос новичка (я новичок в Symfony): мне нужно запускать какую-то команду или что-то делать, когда я изменяю файл config.yml?
Предполагая, что вы пытаетесь загрузить среду dev, я так не думаю, нет. Для prod вам потребуется cache:clear. Вы получаете ошибку?
Да, у меня внутренняя ошибка сервера 500. Я обновлюсь, когда найду причину.
Все еще не работает ... Разве в строке функционального регистра в config.yml не должно быть что-то вроде «Beberlei»? Я имею ввиду: round: Beberlei\DoctrineExtensions\Query\Mysql\Round или что-то в этом роде?
По мнению исходный код, это не так. Какую ошибку вы видите на самом деле? HTTP 500 Internal error - это prod, говорящий, что что-то перевернулось, но что говорит dev?
Здравствуй! Извините, у нас был выходной, и я не пришла на работу. Это ошибка, которую выдает приложение: [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/QueryException.. Кажется, что он не загружает функцию ROUND из DoctrineExtensions ...
странно ... не могли бы вы обновить свой вопрос с помощью раздела doctrine в config.yml?
Я вижу, что в приложении установлены «расширения доктрины gedmo». Кроме того, в
app/config/config.ymlя вижу 2 сопоставления gedmo (gedmo_tree и gedmo_loggable) под ключом «doctrine / orm». Не могли бы вы помочь мне с тем, что мне нужно добавить для поддержки функции ROUND в DQL? Спасибо!