我已经遵循了关于学说的参考页面和其他几个来源的官方指示,但我无法弄清楚错误是什么。 显然它没有加载我的用户定义的功能。 我使用ZF2 + Doctrine 2进行自动加载器设置。
以下是我所拥有的:
错误:
[语法错误]第0行,第7行:错误:预期的IdentificationVariable | ScalarExpression | AggregateExpression |功能声明| PartialObjectExpression | "(" Subselect")" | CaseExpression,得到了 ' FROM'
args:[" SELECT FROM CadastrosAuxiliares \ Entity \ Bairro b WHERE upper_tira_acento(b.uf)=:uf"] 0:" SELECT FROM CadastrosAuxiliares \ Entity \ Bairro b WHERE upper_tira_acento(b.uf)= :UF" class:" Doctrine \ ORM \ Query \ QueryException"档案: "(...)/供应商/教义/ ORM / LIB /学说/ ORM /查询/ Parser.php"功能 :" dqlError" line:448 type:" ::"
doctrine.global.php
<?php
return array(
'doctrine' => array(
'configuration' => array(
'orm_default' => array(
'string_functions' => array(
'upper_tira_acento' => 'Application\DoctrineFunction\UpperTiraAcento'
),
)
)
)
);
UpperTiraAcento.php
<?php
namespace Application\DoctrineFunction;
use Doctrine\ORM\Query\Parser;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\SqlWalker;
class UpperTiraAcento extends FunctionNode
{
public $parameters = array();
const STRING_PARAM = 'string';
/**
* {@inheritdoc}
*/
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->parameters[self::STRING_PARAM] = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(SqlWalker $sqlWalker)
{
$string = $sqlWalker->walkStringPrimary($this->parameters[self::STRING_PARAM]);
return sprintf('dbo.upper_tira_acento(%s)',$string);
}
}
DQL构建器示例:
$qbBairro = $em->createQueryBuilder()->from('CadastrosAuxiliares\Entity\Bairro', 'b');
$qbBairro->andWhere("upper_tira_acento(b.uf) = :uf")->setParameter('uf', $estado->getId());
有没有人知道可能出现什么问题?
提前感谢您的帮助。
答案 0 :(得分:0)
由于您的SELECT
子句中没有任何内容,因此会引发错误。不确定是什么导致了这一点。
SELECT FROM CadastrosAuxiliares\Entity\Bairro b WHERE upper_tira_acento(b.uf)
应该是
SELECT b FROM CadastrosAuxiliares\Entity\Bairro b WHERE upper_tira_acento(b.uf)
^
尝试这样一次:
$em->createQueryBuilder('b')
// ^
->from('CadastrosAuxiliares\Entity\Bairro', 'b');
->andWhere("upper_tira_acento(b.uf) = :uf")->setParameter(
'uf', $estado->getId()
);