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

时间:2013-09-16 11:28:33

标签: mysql sql doctrine-orm sql-date-functions

我想在本机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栏:错误:预期的已知功能,得到'年'

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

备注:

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

5 个答案:

答案 0 :(得分:31)

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

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

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

答案 1 :(得分:3)

orocrm/doctrine-extensions似乎也是一个很好的项目

它支持 MySQL PostgreSql ..目标是跨数据库

答案 2 :(得分:1)

转到this page并选择数据库系统并选择所需的功能

... 我也遇到了与您相同的问题...然后,我使用与github文件中的名称完全相同的名称修改了doctrine.yaml文件,并且它起作用了。

答案 3 :(得分:0)

Symfony 4 中,如果使用,则必须安装DoctrineExtensions。

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

安装命令:

composer require beberlei/DoctrineExtensions

答案 4 :(得分:0)

对于Symfony 4:

  1. 安装:作曲家需要beberlei / doctrine扩展名
  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
        ]);
    }
    ````