2014-02-09 5 views
1

나는 내 사용자 지정 SQL 함수를 추가하려고합니다.Doctrine2 Symfony2 사용자 정의 함수 파서

내 함수는 다음과 같다 : 구문 분석에 대한

DISTANCE(15.154454, 5.121444, -15.321111, 15.12111) 

나는이 파서를 추가

use Doctrine\ORM\Query\Lexer; 

class Distance extends \Doctrine\ORM\Query\AST\Functions\FunctionNode 
{ 
    public $lat_a = null; 
    public $lat_b = null; 
    public $lon_a = null; 
    public $lon_b = null; 

    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->lat_a = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_COMMA); 
     $this->lon_a = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_COMMA); 
     $this->lat_b = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_COMMA); 
     $this->lon_b = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
     return 'DISTANCE(' . 
     $this->lat_a->dispatch($sqlWalker) . ', ' . 
     $this->lon_a->dispatch($sqlWalker) . ', ' . 
     $this->lat_b->dispatch($sqlWalker) . ', ' . 
     $this->lon_b->dispatch($sqlWalker) . 
     ')'; 
    } 
} 

괜찮아,이 잘 작동하지만 난 "-15.321111"와 같은 부정적인 VAR를 사용하는 경우, 나는 오류 500을 얻는다. ... 긍정적 인 var와 더불어, 누구나는 ok 다.

누구든지 부정적인 var 구문 분석에 도움이 될 수 있습니까?

답변

2

이 시도 :

public function parse(\Doctrine\ORM\Query\Parser $parser) 
{ 
    $parser->match(Lexer::T_IDENTIFIER); 
    $parser->match(Lexer::T_OPEN_PARENTHESIS); 
    $this->lat_a = $parser->ArithmeticExpression(); 
    $parser->match(Lexer::T_COMMA); 
    $this->lon_a = $parser->ArithmeticExpression(); 
    $parser->match(Lexer::T_COMMA); 
    $this->lat_b = $parser->ArithmeticExpression(); 
    $parser->match(Lexer::T_COMMA); 
    $this->lon_b = $parser->ArithmeticExpression(); 
    $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
} 

public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
{ 
    return 'DISTANCE(' . 
    $sqlWalker->walkArithmeticExpression($this->lat_a) . ', ' . 
    $sqlWalker->walkArithmeticExpression($this->lon_a) . ', ' . 
    $sqlWalker->walkArithmeticExpression($this->lat_b) . ', ' . 
    $sqlWalker->walkArithmeticExpression($this->lon_b) . 
    ')'; 
} 
+0

그것은 도움을 확인 들으이다. 구문 분석에서 ArithmeticExpression을 사용하기 만하면됩니다. –