【问题标题】:how to use CONVERT() function MySQL in Doctrine如何在 Doctrine 中使用 CONVERT() 函数 MySQL
【发布时间】:2018-07-10 06:47:50
【问题描述】:

我在字符串类型的实体中有一个字段,我需要在我的 dql 中排序结果来赋值整数

我在字符串类型的实体中有一个字段,我需要按该字段排序但转换为整数的结果。

有些像这样(MySQL 查询):

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

如何在学说中创建此查询?

更新

感谢这篇文章,我设法用 cast 功能做到了:

CASTING attributes for Ordering on a 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

【问题讨论】:

  • 很不清楚你在问什么。请尝试在细节上而不是在“清晰度”中改善您的问题。谢谢。
  • @DonCallisto table1.code 是一个字符串类型,我需要将此值转换为整数以对该值进行排序。对不起我的英语

标签: php mysql symfony doctrine-orm doctrine


【解决方案1】:

AFAIK 你不能直接做。 Doctrine 不支持本地 mysql 函数(转换、日、月等)。 理念 od 原则是能够与许多不同的数据库进行对话——这就是为什么没有任何本地函数的原因。

但是

你可以自己做。

几年前,我需要在学说中使用数据函数(日/月等),所以我设法将它添加到学说中。

看这里:

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

【讨论】:

    【解决方案2】:
    <?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);
        }
    }
    

    【讨论】:

    • 你能举一个使用这个函数的例子吗?谢谢
    【解决方案3】:

    如果您只想对查询进行排序,您可以对代码进行排序,即使它是这样的字符串。

    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));
    

    只需确保您的代码都是数字,这样您就不会出错。 希望对你有帮助。

    【讨论】:

    • 谢谢,但我需要这个查询来获取教义,而不是 mysql
    • 抱歉我没看到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2010-09-20
    • 2021-03-16
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多