我使用Symfony 2和ORM Doctrine。我想创建并注册一个自定义的DQL函数。其实,我想使用SQL函数 “CAST” 在我的要求下,像这样:在Doctrine和Symfony2中使用自定义DQL函数时出错
$qb = $this->_em->createQueryBuilder();
$qb->select('d')
->from('\Test\MyBundle\Entity\MyEntity', 'd')
->orderBy('CAST(d.myField AS UNSIGNED)', 'ASC')
return $qb->getQuery()->getResult();
对于这一点,我创建了一个 “CastFunction” 谁扩展 “FunctionNode”:
namespace Test\MyBundle\DQL;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\SqlWalker;
use Doctrine\ORM\Query\Parser;
class CastFunction extends FunctionNode
{
public $firstDateExpression = null;
public $secondDateExpression = null;
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->firstDateExpression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_IDENTIFIER);
$this->secondDateExpression = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return sprintf('CAST(%s AS %s)', $this->firstDateExpression->dispatch($sqlWalker), $this->secondDateExpression->dispatch($sqlWalker));
}
}
当然,我已经注册了这个类在我config.yml:
doctrine:
orm:
dql:
string_functions:
CAST: Test\MyBundle\DQL\CastFunction
现在,当我尝试了我的请求,我得到了以下错误:
“[语义错误]第0行,第83列'UNSIGNED'附近):错误:'UNSIGNED'未定义。”
我搜索,但我不知道问题在哪里!
你有想法吗?
你是如何通过对象访问“sortx”属性的? – hardik