2011-12-30 6 views
5

Próbuję utworzyć niestandardową funkcję DQL, która pozwoli mi używać funkcji ciągu MySQL CONV w moim DQL. Moim celem jest umożliwienie sprawdzania bitów zawartości, która jest przechowywana w hex. Wcześniej Właśnie wykonywane zapytania SQL, takich jak:Niestandardowa funkcja DQL do replikacji MySQL CONV

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

Jednak chcę przekonwertować te zapytań SQL do formatu DQL. Nie mogę się dowiedzieć, jak wprowadzić "& 4096 = 4096" do analizatora składni. To jest tak daleko, jak udało mi się dostać:

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

którego jestem następnie używając tak:

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

Wszelkie sugestie, jak najlepiej zakończyć SQL do DQL przejścia dla Funkcja konwertera MySQL CONV?

Odpowiedz

0

K, tylko po to, aby pomóc komukolwiek innemu w przyszłości. Zdałem sobie sprawę, mój problem polegał na tym, że starałem się ciężko zachować składnię SQL w DQL. Zdałem sobie sprawę z tego, że mój problem umożliwił mi uzupełnienie funkcji 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); 
    } 
} 
Powiązane problemy