CASTING attributes for Ordering on a Doctrine2 DQL Query

后端 未结 7 443
一向
一向 2020-12-03 03:33

I am trying to get Doctrine2 Entities, ordered by their ID which apparently is a String even though it contains only Numbers. So what I would like to do is

7条回答
  •  有刺的猬
    2020-12-03 03:40

    You should be able to add your own function to implement this feature.

    The class would look something like this:

    namespace MyProject\Query;
    
    use Doctrine\ORM\Query\AST\Functions\FunctionNode;
    use Doctrine\ORM\Query\Lexer;
    use Doctrine\ORM\Query\Parser;
    use Doctrine\ORM\Query\SqlWalker;
    
    class CastAsInteger extends FunctionNode
    {
        public $stringPrimary;
    
        public function getSql(SqlWalker $sqlWalker)
        {
            return 'CAST(' . $this->stringPrimary->dispatch($sqlWalker) . ' AS integer)';
        }
    
        public function parse(Parser $parser)
        {
            $parser->match(Lexer::T_IDENTIFIER);
            $parser->match(Lexer::T_OPEN_PARENTHESIS);
    
            $this->stringPrimary = $parser->StringPrimary();
    
            $parser->match(Lexer::T_CLOSE_PARENTHESIS);
        }
    }
    

    You'll need to register your function:

    $config = $em->getConfiguration();
    $config->addCustomNumericFunction('INT', 'MyProject\Query\CastAsInteger');
    

    Then you can use it:

    SELECT e, INT(e.id) AS HIDDEN orderId FROM Namespace\Bla\MyEntity e ORDER BY orderId
    

    PS: By adding the HIDDEN keyword, the alias orderId won't be in the results (and is only used for ordering).

提交回复
热议问题