学说预期 Lexer::T_FROM,得到">"



(Symfony 3.2.7)

我在存储库中创建了这个查询:

$qb = $this->createQueryBuilder('c');
$qb->select($qb->expr()->gte('c.createdDate', 'CURRENT_TIMESTAMP()').' AS HIDDEN x');
$qb->orderBy('x');
$qb->getQuery()->execute();

它正在生成这个DQL:

SELECT c.createdDate >= CURRENT_TIMESTAMP() AS HIDDEN x 
FROM AppCatalogBundleEntityCompany c 
ORDER BY x ASC

而且。。。它正在生成以下错误:

[语法错误]第0行,第21列:错误:预期的Doctrine\ORM\Query\Lexer::T_FROM,得到'>'

这里可能出了什么问题?


解决方案

多亏了@bishop的回答,我成功地创建了一个解决方案来解决我创建自定义Doctrine DQL函数的问题。配置:

doctrine:
orm:
dql:
datetime_functions:
DATES_COMPARE: AppBundleDQLDatesCompareFunction

下面是所提到的类包含的内容:

use DoctrineORMQuery;
use DoctrineORMQueryASTFunctionsFunctionNode;
class DatesCompareFunction extends FunctionNode
{
/* @var QueryASTNode  */
public $param1;
/* @var QueryASTNode  */
public $param2;
/* @var QueryASTNode  */
public $param3;
/** @inheritdoc */
public function getSql(QuerySqlWalker $sqlWalker)
{
return sprintf(
'CASE (%s %s %s) WHEN 1 THEN 1 ELSE 0 END',
$this->param1->dispatch($sqlWalker),
$this->param2,
$this->param3->dispatch($sqlWalker)
);
}
/** @inheritdoc */
public function parse(QueryParser $parser): void
{
$parser->match(QueryLexer::T_IDENTIFIER);
$parser->match(QueryLexer::T_OPEN_PARENTHESIS);
$this->param1 = $parser->StringPrimary();
$parser->match(QueryLexer::T_COMMA);
$this->param2 = $parser->ComparisonOperator();
$parser->match(QueryLexer::T_COMMA);
$this->param3 = $parser->StringPrimary();
$parser->match(QueryLexer::T_CLOSE_PARENTHESIS);
}
}

因此,以下DQL的一切都正常工作:

SELECT DATES_COMPARE(c.subscriptionEndDate, >, CURRENT_TIMESTAMP()) AS x 
FROM AppCatalogBundleEntityCompany c 
ORDER BY x DESC

您的语句是有效的SQL,但请记住:SQL!=DQL。检查DQL的文档,我们看到SELECT有这个BNF:

SelectExpression::=(IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression |"("Subselect")"| CaseExpression | NewObjectExpression)[["AS"]["HIDDEN"]AliasResultVariable]

>=运算符仅出现在条件表达式:中

ConditionalExpression::=ConditionalTerm{"OR"ConditionalTerm}*ConditionalTerm::=条件因子{"AND"条件因子}*ConditionalFactor::=["NOT"]ConditionalPrimaryConditionalPrimary::=SimpleConditionalExpression|"("ConditionalExpression")"SimpleConditionalExpression::=ComparisonExpression|BetweenExpression|LikeExpression|InExpression | NullComparisonExpression | ExistsExpression|EmptyCollectionComparisonExpression | CollectionMemberExpression|表达式实例

ComparisonExpression::=算术表达式ComparisonOperator(QuantifiedExpression|ArithmeticExpression)

ComparisonOperator::="="|"<"|"<="|"<>"|">="|"!=">

由于SelectExpression不包括ConditionalExpression,因此您将遇到词法错误。

为了实现您想要的,您需要一个自定义函数。请参阅"将您自己的函数添加到DQL语言"以了解如何执行此操作。

相关内容

  • 没有找到相关文章

最新更新