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

时间:2018-01-31 08:12:16

标签: php mysql symfony doctrine-orm doctrine

我在一个字符串类型的实体中有一个字段,我需要在我的dql中将订单结果赋值为整数

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

有些像这样(MySQL查询):

function loadAudio(url) {
    return new Promise((resolve, reject) => {
    var audio = new Audio();
    audio.oncanplaythrough = () => resolve(audio);
    audio.onerror = reject;
    audio.src = url;
  });
}

$("#file").change(function(e){
    var files = e.currentTarget.files;
    var length = songs.length;

    Promise.all(Array.from(files).map(file => loadAudio(URL.createObjectURL(file))))
    .then(audios => {
        console.log("Audio elements: ", audios)
    });
});

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

更新

由于这篇文章,我设法使用强制转换功能:

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

3 个答案:

答案 0 :(得分:2)

AFAIK你不能直接这样做。 Doctrine不支持本机mysql函数(转换,日,月等)。 Idea od教义是能够与许多不同的数据库交谈 - 这就是为什么没有任何本机功能。

<强>但

你可以自己做。

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

看这里:

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

看到过转换的解决方案,但从未测试过,请看这里

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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

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

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

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