如何在Doctrine2中使用SQL的YEAR(),MONTH()和DAY()?

Got*_*bel 29 mysql sql sql-date-functions doctrine-orm

我想在本机SQL中执行一个看起来像这样的查询:

SELECT
    AVG(t.column) AS average_value
FROM
    table t
WHERE
    YEAR(t.timestamp) = 2013 AND
    MONTH(t.timestamp) = 09 AND
    DAY(t.timestamp) = 16 AND
    t.somethingelse LIKE 'somethingelse'
GROUP BY
    t.somethingelse;
Run Code Online (Sandbox Code Playgroud)

如果我试图在Doctrine的查询生成器中实现这个,如下所示:

$qb = $this->getDoctrine()->createQueryBuilder();
$qb->select('e.column AS average_value')
   ->from('MyBundle:MyEntity', 'e')
   ->where('YEAR(e.timestamp) = 2013')
   ->andWhere('MONTH(e.timestamp) = 09')
   ->andWhere('DAY(e.timestamp) = 16')
   ->andWhere('u.somethingelse LIKE somethingelse')
   ->groupBy('somethingelse');
Run Code Online (Sandbox Code Playgroud)

我得到错误异常

[语法错误]第0行,第63行:错误:预期的已知函数,得到'年'

如何使用Doctrines查询构建器实现我的查询?

笔记:

  • 我知道Doctrine的Native SQL.我试过这个,但它导致了我的高效和我的开发数据库表有不同名称的问题.我想工作数据库不可知,所以这是没有选择.
  • 虽然我想工作db不可知:FYI,我正在使用MySQL.
  • 有办法将Doctrine扩展到"学习" YEAR()等语句,例如,如此处所示.但我正在寻找避免包含第三方插件的方法.

ale*_*x88 39

您可以添加Doctrine扩展,以便在Symfony上添加此配置时可以使用MySql YEARMONTH语句:

doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
Run Code Online (Sandbox Code Playgroud)

现在您可以在DQL或querybuilder中使用MONTH和YEAR语句.

  • 您的评论是我正在寻找的答案.所以我接受了这个答案:-) (2认同)
  • 如果数据库是sqlite或pgsql怎么办? (2认同)
  • @ pikachu0编辑答案对其他人更有帮助,而不仅仅是在纠正这里明显错误的信息时发表评论. (2认同)

小智 5

In Symfony 4 you must install DoctrineExtensions:

composer require beberlei/DoctrineExtensions
Run Code Online (Sandbox Code Playgroud)

And then edit the doctrine config file (config/packages/doctrine.yaml) as follow:

doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
Run Code Online (Sandbox Code Playgroud)

  • @drAlberT 事实上,考虑到帖子的日期。但这个 anszer 对于现在登陆这里的人来说是一种更新,所以它是值得赞赏的 (3认同)
  • 它对我搜索 DAY() 有很大帮助。即使不是 Symfony 4,对我来说对 Symfony 4 也有帮助 (2认同)