简体   繁体   English

Doctrine2 Symfony2自定义函数解析器

[英]Doctrine2 Symfony2 Custom function parser

i try to add my custom sql function. 我尝试添加我的自定义sql函数。

my function is like this : 我的功能是这样的:

DISTANCE( 15.154454, 5.121444, -15.321111, 15.12111)

I add this parser for parse it : 我添加此解析器进行解析:

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

It's ok, this work fine but when i use negative var like "-15.321111", i get an error 500... With positive var, all it's ok. 没关系,这工作正常,但是当我使用负变量(如“ -15.321111”)时,出现错误500 ...使用正变量,一切正常。

Anyone can help me for parse negative var ? 有人可以帮助我解析负var吗?

Try this: 尝试这个:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM