2017-11-15 10 views
1

(심포니 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하는


솔루션

덕분에, 나는 사용자 정의 교리 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

감사합니다. 나는 적절한 해결책을 만들 수 있었고 그것을 나의 질문의 내용에 추가했다. –