我有以下代码,它依赖于Doctrine的QueryBuilder API来生成DQL状态.
class PlayerRepository extends EntityRepository { public function findByPartialNameMatch($trainer,$fullName) { $qb = $this->createQueryBuilder('tp'); $qb->innerJoin('tp.player','p') ->where($qb->expr()->andX( $qb->expr()->orX( $qb->expr()->like( $qb->expr()->concat('p.firstName',$qb->expr()->concat(' ','p.lastName')),$qb->expr()->literal($fullName.'%') ),$qb->expr()->like( $qb->expr()->concat('p.lastName','p.firstName')),$qb->expr()->literal($fullName.'%') ) ),$qb->expr()->eq('tp.trainer','?1') ) ) ->groupBy('p.id') ->orderBy('p.lastName','ASC') ->orderBy('p.firstName','ASC') ->setParameter(1,$trainer); return $qb->getQuery()->getResult(); }
}
当我运行它时,Symfony2抛出以下错误消息:
[Syntax Error] line 0,col 123: Error: Expected StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression,got ','
at QueryException ::SyntaxError ('line 0,col 123: Error: Expected StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression,'') in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\Parser.PHP at line 396 -+ at Parser ->SyntaxError ('StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression') in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\Parser.PHP at line 2391 -+ at Parser ->StringPrimary () in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\AST\Functions\ConcatFunction.PHP at line 60 -+ at ConcatFunction ->parse (object(Parser)) in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\Parser.PHP at line 2852 -
从上面可以看出,这个问题与concat helper函数有某种关系,并且该函数需要枚举输入,但不知何故(?)收到了一个逗号(,).
谢谢你的帮助!
问题在于这一部分:
$qb->expr()->concat(' ','p.lastName')
你不能只是放空间,因为教义期望这里有一些识别者.试试这个:
$qb->expr()->concat($qb->expr()->literal(' '),'p.lastName')