我使用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