2014-02-09 99 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」負無功,我得到一個錯誤500 ... 隨着積極的變種,所有沒關係。

任何人都可以幫我解析負面的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

它是幫助確定THX。 我只是在解析中使用ArithmeticExpression,並且一切正常。 –