自定义DQL函数来复制MySQL CONV

Mad*_*nty 5 symfony doctrine-orm

我正在尝试创建一个自定义DQL函数,以允许我在我的DQL中使用MySQL CONV字符串函数.我的目标是能够对以十六进制存储的内容执行位检查.以前我刚刚执行过SQL查询,例如:

.... where conv(`myField`,16,10) & 4096 = 4096
Run Code Online (Sandbox Code Playgroud)

但是,我想将这些SQL查询转换为DQL格式.我无法弄清楚的是如何将'&4096 = 4096'带入解析器.这是我能够得到的:

namespace Acme\TestBundle\DQL;

use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\AST\Functions\FunctionNode; 

class MysqlConv extends FunctionNode
{
        public $stringFirst; 
        public $stringSecond; 
        public $stringThird; 
        public $stringFourth; 

    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 
        $parser->match(Lexer::T_IDENTIFIER); 
        $parser->match(Lexer::T_OPEN_PARENTHESIS); 
        $this->stringFirst = $parser->StringPrimary(); 
        $parser->match(Lexer::T_COMMA);
        $this->stringSecond = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->stringThird = $parser->ArithmeticPrimary();      
        $parser->match(Lexer::T_CLOSE_PARENTHESIS); 


    } 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
        return 'CONV(' . 
            $this->stringFirst->dispatch($sqlWalker) . 
        ',' . $this->stringSecond->dispatch($sqlWalker) . ',' . $this->stringThird->dispatch($sqlWalker) . ') & 4096'; 
    } 
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的:

    return $this->getEntityManager()
            ->createQuery('SELECT c, h FROM AcmeTestBundle:Company c LEFT JOIN c.CompanyAssoc h WHERE CONV(c.myField,16,10) = 4096')
            ->getResult();
Run Code Online (Sandbox Code Playgroud)

有关如何最好地完成MySQL CONV函数的SQL到DQL转换的任何建议?

Mad*_*nty 0

K,只是为了帮助其他人将来关注这个问题。我意识到我的问题是我试图努力在 DQL 中保留 SQL 语法。意识到这是我的问题使我能够完成 DQL 功能。

namespace Acme\TestBundle\DQL;

use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\AST\Functions\FunctionNode; 

/** 
 * MysqlConvFunction ::= "CONV(StringPrimary,16,10,4096) = 4096" 
 *      returns CONV(StringPrimary,16,10) & 4096 = 4096
 */ 
class MysqlConv extends FunctionNode
{
    public $stringFirst; 
    public $stringSecond; 
    public $stringThird; 
    public $stringFourth; 

    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 
        $parser->match(Lexer::T_IDENTIFIER); 
        $parser->match(Lexer::T_OPEN_PARENTHESIS); 
        $this->stringFirst = $parser->StringPrimary(); 
        $parser->match(Lexer::T_COMMA);
        $this->stringSecond = $parser->ArithmeticPrimary();
        $parser->match(Lexer::T_COMMA);
        $this->stringThird = $parser->ArithmeticPrimary();     
        $parser->match(Lexer::T_COMMA);
        $this->stringFourth = $parser->ArithmeticPrimary();          
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);          
    } 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
        return 'CONV(' . 
            $this->stringFirst->dispatch($sqlWalker) . 
        ',' . $this->stringSecond->dispatch($sqlWalker) . ',' . $this->stringThird->dispatch($sqlWalker) . ') & ' . $this->stringFourth->dispatch($sqlWalker); 
    } 
}
Run Code Online (Sandbox Code Playgroud)