как использовать функцию CONVERT () MySQL в Doctrine

0

У меня есть поле в сущности в строковом типе, мне нужно получить результат заказа в моем dql для значения integer

У меня есть поле в сущности в строковом типе, мне нужен результат, отсортированный по этому полю, но преобразованный в целое число.

Некоторым вроде этого (MySQL Query):

SELECT * FROM table1 ORDER BY CONVERT(code, UNSIGNED);

Как создать этот запрос в доктрине?

ОБНОВИТЬ

Благодаря этому сообщению я смог сделать это с помощью функции броска:

Атрибуты CASTING для заказа в Doctrine2 DQL Query

Я создал свою собственную функцию для реализации этой функции.

Официальный док в доктрине:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#adding-your-own-functions-to-the-dql-language

  • 2
    Очень непонятно, о чем ты спрашиваешь. Пожалуйста, попробуйте улучшить свой вопрос либо в деталях, чем в «ясности». Благодарю.
  • 0
    @DonCallisto table1.code является строковым типом, мне нужно преобразовать это значение в целое число для сортировки этого значения. Извините за мой английский
Показать ещё 1 комментарий
Теги:
doctrine
doctrine2

3 ответа

1

AFAIK Вы не можете сделать это напрямую. Doctrine не поддерживает собственные функции mysql (конвертировать, день, месяц и т.д.). Идея доктрины заключается в том, чтобы иметь возможность говорить со многими различными базами данных - и почему нет каких-либо нативных функций.

но

вы можете сделать это самостоятельно.

Несколько лет назад мне нужны функции данных (день/месяц и т.д.) В доктрине, поэтому мне удается добавить ее в доктрину.

Смотри сюда:

https://github.com/poznet/SF2Core/blob/master/src/Poznet/CoreBundle/Dql/Year.php или https://github.com/beberlei/DoctrineExtensions

увиденные решения для конверсии тоже, но никогда не проверяли его, смотрите здесь

https://gist.github.com/liverbool/6345800

  • 0
    Я собираюсь посмотреть на это, спасибо!
1
<?php

class ConvertUsing extends FunctionNode
{
    public $field;

    public $using;

    public $charset;

    /**
     * @override
     */
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return sprintf('CONVERT(%s USING %s)',
            $sqlWalker->walkArithmeticPrimary($this->field),
            //$sqlWalker->walkSimpleArithmeticExpression($this->using), // or remove USING and uncomment this
            $sqlWalker->walkSimpleArithmeticExpression($this->charset)

        );
    }

    /**
     * @override
     */

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->field   = $parser->ArithmeticPrimary();
        // adopt use bypass validate variable of parse by using AliasResultVariable ...!!
        $this->using   = $parser->AliasResultVariable();
        $this->charset = $parser->AliasResultVariable();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
}
  • 0
    Можете ли вы привести пример использования этой функции? Спасибо
0

Если вы хотите только отсортировать свой запрос, вы можете отсортировать код, даже если это такая строка.

SELECT * FROM table1 ORDER BY code ASC; <- for ascending

SELECT * FROM table1 ORDER BY code DESC; <- for descending

Если вы хотите преобразовать его в integer, попробуйте это

SELECT * FROM table1 ORDER BY (SELECT CONVERT(int, code));

Просто убедитесь, что ваши коды - все номера, поэтому вы не получите ошибку. Я надеюсь, что это помогает.

  • 0
    Спасибо, но мне нужен этот запрос для доктрины, а не для mysql
  • 0
    Извини, мой плохой, я этого не видел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню