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?