Doctrine2 - 特定的NULL排序

时间:2012-03-05 08:52:18

标签: doctrine-orm

当您对列a降序排序时,它会将所有记录a NULL放在底部,这是有道理的。当我对属性a降序进行排序时,我想要的是以下排序:

a
----
NULL
NULL
5
4
3
2
1

我知道Oracle有NULLS_FIRST,在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).')';
    }
}

将它在Symfony2中连接到Doctrine2就像这样(app.yml):

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

我无法在ORDER BY子句中使用这些功能,但通过SELECT ISNULL(a) AS n_a我可以在n_a属性上订购。

1 个答案:

答案 0 :(得分:0)

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