Doctrine orm Doctrine2-特定的空排序

Doctrine orm Doctrine2-特定的空排序,doctrine-orm,Doctrine Orm,当您按列a降序排序时,它会将所有a

当您按列
a
降序排序时,它会将所有
a
的记录放在底部,这是有意义的。当我按属性
a
降序排序时,我需要的是以下顺序:

a
----
NULL
NULL
5
4
3
2
1
我知道Oracle有
NULLS\u第一个
,在MySQL中你可以使用
ORDER BY ISNULL(a)
,但我想知道是否有一种优雅的方式来处理这个问题,只使用Doctrine2功能?因此不使用本机查询等


在S0pa的帮助下回答:我使用Doctrine2的以下新功能节点修复了它:

<?php
namespace MyBundle\General;

use \Doctrine\ORM\Query\Lexer;

class IsnullFunctionNode extends \Doctrine\ORM\Query\AST\Functions\FunctionNode
{
    private $isnull;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->isnull = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'ISNULL('.$this->isnull->dispatch($sqlWalker).')';
    }
}

我不能在我的
orderby
子句中使用这些函数,但是通过执行
选择ISNULL(a)作为n_a
我可以在
n_a
属性上进行排序。

我认为最好的方法是使用定义自己的DQL函数。根据数据库管理系统的不同,您仍然需要处理不同的情况

doctrine:
  orm:
    entity_managers:
      default:
        ...
        dql:
          numeric_functions:
            isnull: Diagenda\CommonBundle\General\IsnullFunctionNode