我在字符串类型的实体中有一个字段,我需要在我的 dql 中排序结果到值整数
我在字符串类型的实体中有一个字段,我需要按该字段排序但转换为整数的结果。
有些像这样(MySQL查询(:
SELECT * FROM table1 ORDER BY CONVERT(code, UNSIGNED);
如何在原则中创建此查询?
更新
多亏了这篇文章,我设法使用cast功能做到了这一点:
对原则2 DQL 查询进行排序的强制转换属性
我已经创建了自己的函数来实现此功能。
教义官方文件:
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#adding-your-own-functions-to-the-dql-language
AFAIK 你不能直接做.学说不支持原生的mysql函数(转换,日,月等(。Idea od doctrine 是能够与许多不同的数据库进行对话 - 这就是为什么没有任何本机函数的原因。
但
你可以自己做。
几年前,我需要学说中的数据函数(日/月等(,所以我设法添加它做教义。
看这里:
https://github.com/poznet/SF2Core/blob/master/src/Poznet/CoreBundle/Dql/Year.php或https://github.com/beberlei/DoctrineExtensions
也看到了Conver的解决方案,但从未测试过它,看这里
https://gist.github.com/liverbool/6345800
<?php
class ConvertUsing extends FunctionNode
{
public $field;
public $using;
public $charset;
/**
* @override
*/
public function getSql(DoctrineORMQuerySqlWalker $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(DoctrineORMQueryParser $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
如果要将其转换为整数,请尝试此操作
SELECT * FROM table1 ORDER BY (SELECT CONVERT(int, code));
只需确保您的代码都是数字,这样您就不会收到错误。我希望它有所帮助。