教义queryBuilder addSelect语法

时间:2018-08-14 09:34:46

标签: symfony doctrine-orm

我正在维护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个内部服务器错误。如果我删除了“ ROUND”功能,则该功能可以使用(但无法正确舍入)。

编辑 根据要求,这是config.yml文件的doctrine部分:

# 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

这是怎么了?预先感谢,

1 个答案:

答案 0 :(得分:2)

ROUND功能开箱即用。请记住,虽然ROUND中有一个SQL函数,但是您在这里处理的是DQL

克服此问题的一种方法是安装doctrine-extensions,它提供许多DQL功能,其中包括ROUND或者,您可以安装捆绑软件StofDoctrineExtensionsBundle,该捆绑软件将负责配置这些功能。

希望这对您有帮助...

更新:

  1. 安装beberlei/DoctrineExtensions。如自述文件README所述,它表示“对Doctrine 2的一组扩展,增加了对MySQL,Oracle,PostgreSQL和SQLite中可用功能的支持”。全面的功能列表迅速显示其中包含ROUND

  2. 注册功能。该主题上确实有很好的Symfony official docs。例如:

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