【问题标题】:Doctrine querybuilder DATE_FORMAT not working教义查询生成器 DATE_FORMAT 不起作用
【发布时间】:2014-10-10 11:17:09
【问题描述】:

我在 createQueryBuilder 中的 DATE_FORMAT 遇到了一些问题

我的代码:

$qb7Days = $repo->createQueryBuilder('R')
        ->select( 'R.createdAt' )
        ->where( "DATE_FORMAT(R.createdAt, '%Y-%m-%d') = :afterDays" )
        ->andWhere( 'R.cCurrentReviewState = :state' )
        ->andWhere( 'R.reminder = :reminder' )
        ->setParameter( 'afterDays', $after7Days )
        ->setParameter( 'state',  $oReviewStateNotVerified ) // not_verified
        ->setParameter( 'reminder',  0 ) // never sent any reminder
        ->orderBy( 'R.id', 'ASC' )
        ->getQuery();

但我得到了

 [Doctrine\ORM\Query\QueryException]                                              
 [Syntax Error] line 0, col 7: Error: Expected known function, got 'DATE_FORMAT'

我搜索了一些链接并找到了一些解释说它应该以这种方式工作,但对我来说似乎我做错了什么。

http://www.uvd.co.uk/blog/labs/using-mysqls-date_format-in-doctrine-2-0/

【问题讨论】:

  • 是的,它很完美。它在简单查询中工作

标签: php mysql date symfony doctrine-orm


【解决方案1】:

Symfony 5 答案

运行

composer require beberlei/doctrineextensions

添加

config/packages/doctrine.yaml

doctrine:
    orm:
        dql:
            datetime_functions:
                DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat

其他 datetime 函数也是如此:

doctrine:
    orm:
        dql:
            datetime_functions:
                DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
                DAY: DoctrineExtensions\Query\Mysql\Day
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year

【讨论】:

    【解决方案2】:

    DATE_FORMAT以及一堆Mysql函数在Doctrine中是不直接可用的。

    要使用它们,您可以创建自己的或添加类似 beberlei/DoctrineExtensions 的扩展,然后将相应的功能添加到您的学说包配置中,如

    doctrine:
        dbal:
            ....
        orm:
            ....
            dql:
                string_functions:
                    DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
    

    【讨论】:

    • 谢谢。我刚刚按照uvd.co.uk/blog/labs/using-mysqls-date_format-in-doctrine-2-0 中的教程进行操作,效果很棒:)
    • 我是这样做的:将 DoctrineExtensions 添加到我的供应商模块后,将 $config->addCustomStringFunction('DATE_FORMAT', 'DoctrineExtensions\Query\Mysql\DateFormat'); 添加到我的 EntityManager 工厂。这里$configDoctrine\ORM\Configuration 的实例,作为EntityManager::create() 的第二个参数传递。
    • 我喜欢 Doctrine Entity 但我讨厌 Doctrine 查询生成器! grr#@!
    • 谢谢.. 它的工作。您可以按上述方式全局指定,也可以在文件级别使用如下方式(不要每次都加载以上配置)$doctrineConfig = $this->_em->getConfiguration(); $doctrineConfig->addCustomStringFunction('DATE', 'DoctrineExtensions\Query\Mysql\Date');
    【解决方案3】:

    DATE_FORMAT 不是字符串函数,它的 date_function:

    config.yml

    doctrine:
         orm:
             dql:
                 datetime_functions:
                     date_format: DoctrineExtensions\Query\Mysql\DateFormat
    

    【讨论】:

      【解决方案4】:

      DATE_FORMAT 不是学说认可的功能。您粘贴的链接是作者为他编写的用于获取 date_formate 的自定义代码。您可以在学说中编写自定义函数并注册它们,整洁吗?

      这是一个如何做到这一点的示例 - http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html

      选项 1:您为 DATE_FORMAT 编写该自定义函数,以便您可以一次又一次地使用它。 选项 2:也许重新格式化 PHP 中的日期以匹配数据库中的日期格式,有点像

      $after7Days->format('Y-m-d');

      【讨论】:

        【解决方案5】:

        我不确定,但这仅对我来说是正确的:

        doctrine:
            orm:
                entity_managers:
                    default:
                        ...
                        dql:
                            datetime_functions:
                                DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
        

        【讨论】:

          猜你喜欢
          • 2015-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多