2011-12-30 14 views
5

DQL内でMySQL CONV文字列関数を使用できるようにカスタムDQL関数を作成しようとしています。私の目標は、16進数で格納されているコンテンツに対してビットチェックを実行できるようにすることです。私はDQL形式にこれらのSQLクエリを変換したいしかしMySQL CONVをレプリケートするカスタムDQL関数

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

:以前は私だけのようなSQLクエリを実行しました。私が理解できないことは、パーサーに '& 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); 
    } 
} 
関連する問題