2011-12-30 19 views
5

Tôi đang cố tạo một hàm DQL tùy chỉnh để cho phép tôi sử dụng hàm chuỗi CONV của MySQL trong DQL của tôi. Mục tiêu của tôi là có thể thực hiện kiểm tra bit đối với nội dung đang được lưu trữ trong hex. Trước đây tôi đã thực hiện truy vấn SQL như:Hàm DQL tùy chỉnh để nhân bản MySQL CONV

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

Tuy nhiên tôi muốn chuyển các truy vấn SQL này thành định dạng DQL. Những gì tôi không thể tìm ra là làm thế nào để mang lại '& 4096 = 4096' vào trình phân tích cú pháp. Đây là như xa như tôi đã có thể nhận được:

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

nào tôi sau đó sử dụng như thế này:

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

Bất kỳ lời đề nghị như thế nào tốt nhất để hoàn thành SQL để DQL chuyển tiếp cho các MySQL CONV chức năng?

Trả lời

0

K, chỉ để giúp bất kỳ ai khác xem xét điều này trong tương lai. Tôi nhận ra vấn đề của tôi là tôi đã cố gắng để giữ lại một cú pháp SQL trong DQL. Nhận ra đây là vấn đề của tôi cho phép tôi hoàn thành chức năng 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); 
    } 
} 
Các vấn đề liên quan