我尝试添加我的自定义 sql 函数。
我的函数是这样的:
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,一切正常。
谁能帮我解析负变量?
最佳答案
试试这个:
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) .
')';
}
关于mysql - Doctrine2 Symfony2 自定义函数解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663005/