一尘不染

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

mysql

我想执行一个在本机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;

如果我想像这样在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');

我收到错误异常

[语法错误]第0行,第63行:错误:预期的已知功能,获取了’YEAR’

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

笔记:

  • 我知道Doctrine的Native SQL。我已经尝试过了,但是这导致了我的生产数据库表和开发数据库表使用不同名称的问题。我想与数据库无关,所以这是没有选择的。
  • 尽管我想使用不可知论的数据库:仅供参考,我正在使用MySQL。
  • 有一种方法可以扩展“教义”以“学习” YEAR()等语句,例如此处所示。但是我正在寻找一种避免包含第三方插件的方法。

阅读 278

收藏
2020-05-17

共1个答案

一尘不染

您可以添加Doctrine扩展名,以便在Symfony上通过添加以下配置来使用MySql
YEARMONTH语句:

doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year

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

2020-05-17