2017-11-15 14 views
1

(symfonyの3.2.7)教義は、私は、リポジトリ内で作成したこのクエリを持っている '>'

を得た、レクサー:: T_FROMを期待:

:それはこのDQLを生成している

$qb = $this->createQueryBuilder('c'); 
$qb->select($qb->expr()->gte('c.createdDate', 'CURRENT_TIMESTAMP()').' AS HIDDEN x'); 
$qb->orderBy('x'); 
$qb->getQuery()->execute(); 

SELECT c.createdDate >= CURRENT_TIMESTAMP() AS HIDDEN x 
FROM App\CatalogBundle\Entity\Company c 
ORDER BY x ASC 

も...それがこのエラーを生成している:

[Syntax Error] line 0, col 21: Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got '>'

ここで何が間違っていますか?答えを@bishopする


SOLUTION

おかげで、私は、カスタム教義DQL関数を作成して私の問題の解決策を作成するために管理。構成:

doctrine: 
    orm: 
     dql: 
      datetime_functions: 
       DATES_COMPARE: AppBundle\DQL\DatesCompareFunction 

そして、ここでは、クラスを述べたものですが含まれています

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

class DatesCompareFunction extends FunctionNode 
{ 
    /* @var Query\AST\Node */ 
    public $param1; 

    /* @var Query\AST\Node */ 
    public $param2; 

    /* @var Query\AST\Node */ 
    public $param3; 

    /** @inheritdoc */ 
    public function getSql(Query\SqlWalker $sqlWalker) 
    { 
     return sprintf(
      'CASE (%s %s %s) WHEN 1 THEN 1 ELSE 0 END', 
      $this->param1->dispatch($sqlWalker), 
      $this->param2, 
      $this->param3->dispatch($sqlWalker) 
     ); 
    } 

    /** @inheritdoc */ 
    public function parse(Query\Parser $parser): void 
    { 
     $parser->match(Query\Lexer::T_IDENTIFIER); 
     $parser->match(Query\Lexer::T_OPEN_PARENTHESIS); 

     $this->param1 = $parser->StringPrimary(); 

     $parser->match(Query\Lexer::T_COMMA); 

     $this->param2 = $parser->ComparisonOperator(); 

     $parser->match(Query\Lexer::T_COMMA); 

     $this->param3 = $parser->StringPrimary(); 

     $parser->match(Query\Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 

だから、すべては、次のDQLのために正常に動作している:

SELECT DATES_COMPARE(c.subscriptionEndDate, >, CURRENT_TIMESTAMP()) AS x 
FROM App\CatalogBundle\Entity\Company c 
ORDER BY x DESC 

答えて

2

あなたの文は、有効なSQLですが、覚えています: SQL!= DQL。

SelectExpression ::= (IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression | NewObjectExpression) [["AS"] ["HIDDEN"] AliasResultVariable]

しかし>=オペレータがConditionalExpressionでのみ表示されます:SelectExpression以来

ConditionalExpression ::= ConditionalTerm {"OR" ConditionalTerm}* ConditionalTerm ::= ConditionalFactor {"AND" ConditionalFactor}* ConditionalFactor ::= ["NOT"] ConditionalPrimary ConditionalPrimary ::= SimpleConditionalExpression | "(" ConditionalExpression ")" SimpleConditionalExpression ::= ComparisonExpression | BetweenExpression | LikeExpression | InExpression | NullComparisonExpression | ExistsExpression | EmptyCollectionComparisonExpression | CollectionMemberExpression | InstanceOfExpression

ComparisonExpression ::= ArithmeticExpression ComparisonOperator (QuantifiedExpression | ArithmeticExpression)

ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!="

ConditionalExpressionが含まれていない、あなたが取得しているDQLためdocsチェック、我々はSELECTこのBNF持って見ますレキシングエラー

目的を達成するには、カスタム関数が必要です。これを行う方法は"Adding your own functions to the DQL language"を参照してください。

+1

ヒントありがとうございます!私は適切なソリューションを作りました。私はそれを私の質問の内容に加えました。 –

関連する問題