如何在 Doctrine 中使用 CONVERT() 函数 MySQL



我在字符串类型的实体中有一个字段,我需要在我的 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));

只需确保您的代码都是数字,这样您就不会收到错误。我希望它有所帮助。

相关内容

  • 没有找到相关文章

最新更新