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機能?