У меня есть поле в сущности в строковом типе, мне нужно получить результат заказа в моем dql для значения integer
У меня есть поле в сущности в строковом типе, мне нужен результат, отсортированный по этому полю, но преобразованный в целое число.
Некоторым вроде этого (MySQL Query):
SELECT * FROM table1 ORDER BY CONVERT(code, UNSIGNED);
Как создать этот запрос в доктрине?
ОБНОВИТЬ
Благодаря этому сообщению я смог сделать это с помощью функции броска:
Атрибуты CASTING для заказа в Doctrine2 DQL Query
Я создал свою собственную функцию для реализации этой функции.
Официальный док в доктрине:
AFAIK Вы не можете сделать это напрямую. Doctrine не поддерживает собственные функции mysql (конвертировать, день, месяц и т.д.). Идея доктрины заключается в том, чтобы иметь возможность говорить со многими различными базами данных - и почему нет каких-либо нативных функций.
но
вы можете сделать это самостоятельно.
Несколько лет назад мне нужны функции данных (день/месяц и т.д.) В доктрине, поэтому мне удается добавить ее в доктрину.
Смотри сюда:
https://github.com/poznet/SF2Core/blob/master/src/Poznet/CoreBundle/Dql/Year.php или https://github.com/beberlei/DoctrineExtensions
увиденные решения для конверсии тоже, но никогда не проверяли его, смотрите здесь
<?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);
}
}
Если вы хотите только отсортировать свой запрос, вы можете отсортировать код, даже если это такая строка.
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));
Просто убедитесь, что ваши коды - все номера, поэтому вы не получите ошибку. Я надеюсь, что это помогает.