Mad*_*nty 5 symfony doctrine-orm
我正在尝试创建一个自定义DQL函数,以允许我在我的DQL中使用MySQL CONV字符串函数.我的目标是能够对以十六进制存储的内容执行位检查.以前我刚刚执行过SQL查询,例如:
.... where conv(`myField`,16,10) & 4096 = 4096
Run Code Online (Sandbox Code Playgroud)
但是,我想将这些SQL查询转换为DQL格式.我无法弄清楚的是如何将'&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';
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的:
return $this->getEntityManager()
->createQuery('SELECT c, h FROM AcmeTestBundle:Company c LEFT JOIN c.CompanyAssoc h WHERE CONV(c.myField,16,10) = 4096')
->getResult();
Run Code Online (Sandbox Code Playgroud)
有关如何最好地完成MySQL CONV函数的SQL到DQL转换的任何建议?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1266 次 |
| 最近记录: |