2

如何date_trunc(text, timestamp)在 Symfony 中将 Postgres 函数与 Doctrine 2 一起使用?

4

1 回答 1

3
  1. 在您的项目中,创建一个名为DoctrineExtensions的新文件夹
  2. 在新文件夹中,创建一个名为DateTrunc.php的文件
  3. 粘贴此代码:

DateTrunc.php

<?php
namespace YOUR_BUNDLE_HERE\DoctrineExtensions;

use Doctrine\ORM\Query\AST\Functions\FunctionNode,
    Doctrine\ORM\Query\Lexer;

/**
 * DateTrunc ::= "date_trunc" "(" ArithmeticPrimary "," ArithmeticPrimary ")"
 */
class DateTrunc extends FunctionNode
{
  // (1)
  public $firstDateExpression = null;
  public $secondDateExpression = null;

  public function parse(\Doctrine\ORM\Query\Parser $parser)
  {
    $parser->match(Lexer::T_IDENTIFIER); // (2)
    $parser->match(Lexer::T_OPEN_PARENTHESIS); // (3)
    $this->firstDateExpression = $parser->ArithmeticPrimary(); // (4)
    $parser->match(Lexer::T_COMMA); // (5)
    $this->secondDateExpression = $parser->ArithmeticPrimary(); // (6)
    $parser->match(Lexer::T_CLOSE_PARENTHESIS); // (3)
  }

  public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker){
    return 'date_trunc(' .
        $this->firstDateExpression->dispatch($sqlWalker) . ', ' .
        $this->secondDateExpression->dispatch($sqlWalker) .
    ')'; // (7)
  }
}
  1. 将功能添加到 Doctrine 配置中

配置.yml

orm:
    dql:
        datetime_functions:
             date_trunc: YOUR_BUNDLE_HERE\DoctrineExtensions\DateTrunc

5. 你现在可以date_trunc(text, timestamp)和 Doctrine 一起使用了!

注意:您可以轻松地为每个附加的 Postgres/MySQL 函数调整此代码。结帐准则扩展

于 2015-06-03T18:56:14.660 回答