当您对列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
属性上订购。