2017-11-15 2 views
1

(Symfony 3.2.7)Lehre erwartet Lexer :: T_FROM erwartet, '>'

ich diese Abfrage haben innerhalb Repository erstellt:

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

Es erzeugt diese DQL:

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

Und auch ... es erzeugt diesen Fehler:

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

Was könnte hier falsch sein?


SOLUTION

Dank Antwort auf @bishop konnte ich mit dem Erstellen einer benutzerdefinierten Lehre DQL Funktion, eine Lösung auf mein Problem schaffen. Konfiguration:

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

Und hier ist das, was erwähnt Klasse enthält:

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); 
    } 
} 

Also alles ordnungsgemäß funktioniert, die folgenden DQL:

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

Antwort

2

Ihre Aussage ist gültig SQL, aber denken Sie daran: SQL! = DQL. Überprüfung der docs für DQL, sehen wir die SELECT hat diese BNF:

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

Aber der >= Operator erscheint nur in ConditionalExpression:

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 ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!="

Da SelectExpression nicht ConditionalExpression enthält, Sie bekommen ein Lexing-Fehler.

Um zu erreichen, was Sie wollen, benötigen Sie eine benutzerdefinierte Funktion. Siehe dazu "Adding your own functions to the DQL language".

+1

Vielen Dank für Ihren Hinweis! Ich habe es geschafft, eine angemessene Lösung zu erstellen, und ich habe sie zum Inhalt meiner Frage hinzugefügt. –

Verwandte Themen