Error when use custom DQL function with Doctrine and Symfony2 Error when use custom DQL function with Doctrine and Symfony2 symfony symfony

Error when use custom DQL function with Doctrine and Symfony2


After several search, I have finally found the solution. I had two problems: first my parse function was wrong, second, I called a SQL function in my orderBy (thank you Cerad).

So, here is my correct class:

namespace Ypok\YPoliceBundle\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 $unit = null;        public function parse(\Doctrine\ORM\Query\Parser $parser)    {        $parser->match(Lexer::T_IDENTIFIER);        $parser->match(Lexer::T_OPEN_PARENTHESIS);        $this->firstDateExpression = $parser->StringPrimary();        $parser->match(Lexer::T_AS);        $parser->match(Lexer::T_IDENTIFIER);        $lexer = $parser->getLexer();        $this->unit = $lexer->token['value'];        $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->unit);    }}

And now, I can use perfectly the SQL function 'CAST' in my repository:

$qb = $this->_em->createQueryBuilder();$qb->select('d, CAST(d.myField AS UNSIGNED) AS sortx')   ->from('\Test\MyBundle\Entity\MyEntity', 'd')   ->orderBy('sortx', 'ASC')return $qb->getQuery()->getResult();

Best regards


Can't find the reference but functions are not allowed in the order by clause. You need to cast your value in the select statement then sort by it.

Something like:

$qb->select('d, CAST(d.myField AS UNSIGNED) AS sortx)   ->from('\Test\MyBundle\Entity\MyEntity', 'd')   ->orderBy('sortx, 'ASC')

That is assuming your CAST function is written correctly.