Używam Symfony 2 i Doktryny ORM. Chcę utworzyć i zarejestrować niestandardową funkcję DQL. W rzeczywistości, chcę użyć funkcji SQL "CAST" na moją prośbę, tak:Błąd podczas używania niestandardowej funkcji DQL z Doctrine i Symfony2
$qb = $this->_em->createQueryBuilder();
$qb->select('d')
->from('\Test\MyBundle\Entity\MyEntity', 'd')
->orderBy('CAST(d.myField AS UNSIGNED)', 'ASC')
return $qb->getQuery()->getResult();
za to, że stworzył "CastFunction" kto przedłużyć "FunctionNode":
namespace Test\MyBundle\DQL;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Parser;
class CastFunction extends FunctionNode
{
public $firstDateExpression = null;
public $secondDateExpression = null;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->firstDateExpression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_IDENTIFIER);
$this->secondDateExpression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return sprintf('CAST(%s AS %s)', $this->firstDateExpression->dispatch($sqlWalker), $this->secondDateExpression->dispatch($sqlWalker));
}
}
Oczywiście, mam zarejestrowany tej klasy w moim config.yml:
doctrine:
orm:
dql:
string_functions:
CAST: Test\MyBundle\DQL\CastFunction
Teraz, gdy próbuję moją prośbę, mogę uzyskać następujący błąd:
"[Błąd semantyczny] wiersz 0, kol. 83 w pobliżu" NIEZNANY) ": Błąd:" NIEZNANY "nie jest zdefiniowany."
Szukam, ale nie wiem, gdzie jest problem!
Masz pomysł?
W jaki sposób uzyskałeś dostęp do właściwości "sortx" przez obiekt? – hardik