2011-12-30 21 views
5

Estoy tratando de crear una función DQL personalizada que me permita usar la función de cadena CONV MySQL dentro de mi DQL. Mi objetivo es poder realizar comprobaciones de bits contra el contenido que se almacena en hexadecimal. Anteriormente acabo de realizar una consulta SQL como:Función DQL personalizada para replicar MySQL CONV

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

Sin embargo, quiero convertir estas consultas SQL en formato DQL. Lo que no puedo entender es cómo incluir '& 4096 = 4096' en el analizador. Esto es por lo que yo he podido conseguir:

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

que estoy a continuación, utilizando la siguiente manera:

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

Cualquier sugerencia en cuanto a la mejor manera de completar el SQL para DQL para la transición Función MySQL CONV?

Respuesta

0

K, solo para ayudar a cualquier otra persona a mirar esto en el futuro. Me di cuenta de que mi problema era que estaba tratando de mantener una sintaxis SQL en DQL. Al darme cuenta de esto, mi problema me permitió completar la función 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); 
    } 
} 
Cuestiones relacionadas