Я пытаюсь реализовать функцию OVERLAPS из postgres в проекте 3.4 Symfony для сопоставления диапазонов дат.
Я сделал следующее расширение:
class DateOverlaps extends FunctionNode
{
public $rangeStart;
public $rangeEnd;
public $targetStart;
public $targetEnd;
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->rangeStart = $parser->InputParameter();
$parser->match(Lexer::T_COMMA);
$this->rangeEnd = $parser->InputParameter();
$parser->match(Lexer::T_COMMA);
$this->targetStart = $parser->SingleValuedPathExpression();
$parser->match(Lexer::T_COMMA);
$this->targetEnd = $parser->SingleValuedPathExpression();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
/**
* @param SqlWalker $sqlWalker
*
* @return string
*/
public function getSql(SqlWalker $sqlWalker)
{
$rangeStart = $this->rangeStart->dispatch($sqlWalker);
$rangeEnd = $this->rangeEnd->dispatch($sqlWalker);
$targetStart = $this->targetStart->dispatch($sqlWalker);
$targetEnd = $this->targetEnd->dispatch($sqlWalker);
return "($rangeStart, $rangeEnd) OVERLAPS ($targetStart, $targetEnd)";
}
}
Конфигурация:
orm:
dql:
string_functions:
overlaps: AppBundle\Driver\DateOverlaps
И использовать его в таком простом хранилище, как это:
public function findRangedEvents(\DateTime $start, \DateTime $end)
{
$qb = $this->createQueryBuilder('event')
->where("overlaps(:start, :end, event.occuringDate, event.occuringEndDate)")
->setParameter('start', $start)
->setParameter('end', $end);
return $qb->getQuery()->getResult();
}
Но я получаю ошибки вроде
"[Syntax Error] line 0, col -1: Error: Expected =, <, <=, <>, >, >=, !=, got end of string."
Я перепробовал много различных функций синтаксического анализатора, но я действительно не могупонять, чего мне не хватает.