2011-12-30 4 views
5

DQL 내에서 MySQL CONV 문자열 함수를 사용할 수 있도록 사용자 정의 DQL 함수를 생성하려고합니다. 내 목표는 16 진수에 저장된 콘텐츠에 대해 비트 검사를 수행 할 수있게하는 것입니다. 이전에 다음과 같은 SQL 쿼리를 수행했습니다.MySQL CONV를 복제하는 사용자 정의 DQL 함수

.... where conv(`myField`,16,10) & 4096 = 4096 

그러나 이러한 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'; 
    } 
} 

:

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

어떤 제안 등 가장에 대한 전환을 DQL하는 SQL을 완료하는 방법에 이것은 지금까지의 내가 얻을 수 있었던 같다 MySQL CONV 기능?

답변

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