Doctrine2 - Специальная NULL-сортировка - PullRequest
4 голосов
/ 05 марта 2012

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

Я думаю, что лучший способ - определить свою собственную функцию DQL, используя это руководство . Вам все равно придется обрабатывать разные случаи в зависимости от вашей системы управления БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...