40

我想在本机 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。我已经尝试过了,但这会导致我的生产数据库表和我的开发数据库表具有不同的名称。我想与数据库无关,所以这是没有选择的。
  • 虽然我想与 db 无关:仅供参考,我正在使用 MySQL。
  • 有一种方法可以扩展 Doctrine 以“学习”YEAR()等语句,例如在这里看到的。但我正在寻找一种避免包含第三方插件的方法。
4

5 回答 5

55

如果你在 Symfony 上,你可以添加Doctrine 扩展,这样你就可以通过添加这个配置来使用 MySqlYEAR和语句:MONTH

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

现在您可以在 DQL 或查询构建器中使用 MONTH 和 YEAR 语句。

注意:该扩展支持 MySQL、Oracle、PostgreSQL 和 SQLite。

于 2013-10-16T10:09:32.560 回答
14

Symfony 4中,您必须安装DoctrineExtensions

composer require beberlei/DoctrineExtensions

然后编辑学说配置文件(config/packages/doctrine.yaml)如下:

doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
于 2019-06-02T21:38:53.757 回答
3

orocrm/doctrine-extensions似乎也是一个不错的项目

它同时支持MySQLPostgreSql .. 目标是跨数据库

于 2015-08-05T13:33:37.670 回答
3

对于 Symfony 4:

  1. 安装: composer 需要 beberlei/doctrineextensions
  2. 编辑: config\packages\doctrine.yaml
    doctrine:
        orm:
            dql:
                datetime_functions:
                    DAY: DoctrineExtensions\Query\Mysql\Day
                    MONTH: DoctrineExtensions\Query\Mysql\Month
                    YEAR: DoctrineExtensions\Query\Mysql\Year
  1. 编辑您的控制器:
    public function somex()
    {
        $em = $this->getDoctrine()->getManager();

        $emConfig = $em->getConfiguration();
        $emConfig->addCustomDatetimeFunction('YEAR', 'DoctrineExtensions\Query\Mysql\Year');
        $emConfig->addCustomDatetimeFunction('MONTH', 'DoctrineExtensions\Query\Mysql\Month');
        $emConfig->addCustomDatetimeFunction('DAY', 'DoctrineExtensions\Query\Mysql\Day');

        $day = '22';
        $month = '4';

        $qb = $em->createQueryBuilder()
            ->select('u')
            ->from('App\Entity\User', 'u')
            ->where('DAY(u.somedate) = :day')
            ->andwhere('MONTH(u.somedate) = :month')
            ->setParameter('month', $day)
            ->setParameter('day', $month)
        ;
        $trab = $qb->getQuery()->getResult();


        return $this->render('intranet/somex.html.twig', [
            'trab' => $trab
        ]);
    }
    ````
于 2019-10-17T16:45:03.017 回答
1

转到此页面并选择您的数据库系统并选择您想要的功能

...我也遇到了和你一样的问题...然后我使用与 github 文件中完全相同的名称修改了我的学说.yaml 文件并且它起作用了。

于 2020-02-20T01:06:03.253 回答