Когда вы сортируете по столбцу 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
.