zf2 + doctrine 2上的用户定义函数无法正常工作

时间:2016-11-12 22:04:25

标签: php zend-framework doctrine-orm zend-framework2 user-defined-functions

我已经遵循了关于学说的参考页面和其他几个来源的官方指示,但我无法弄清楚错误是什么。 显然它没有加载我的用户定义的功能。 我使用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());

有没有人知道可能出现什么问题?

提前感谢您的帮助。

1 个答案:

答案 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()
   );