Symfony2 - 找不到自定义DQL函数

时间:2014-02-14 15:38:58

标签: dql

我跟着这个tuto:http://iksela.tumblr.com/post/4985265226/custom-dql-functions-nvl-convert-to-number

但我仍然得到同样的错误:

SQLSTATE[42000]: Syntax error or access violation: 1305 FUNCTION my_project.TO_NUMBER does not exist  

这是我的代码:

在My_project \ MyBundle \ DoctrineFunctions \ ToNumberFunction.php中:

namespace My_project\MyBundle\DoctrineFunctions;

use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;

class ToNumberFunction extends FunctionNode {


public $field;


/**
 * Parse DQL Function
 *
 * @param \Doctrine\ORM\Query\Parser $parser
 */

public function parse (\Doctrine\ORM\Query\Parser $parser)
{
    $parser->match(Lexer::T_IDENTIFIER);
    $parser->match(Lexer::T_OPEN_PARENTHESIS);
    $this->field = $parser->StringPrimary();
    $parser->match(Lexer::T_CLOSE_PARENTHESIS);
}

/**
 * Get SQL
 *
 * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker
 *
 * @return int
 */
public function getSql (\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
    return 'TO_NUMBER('.$this->field->dispatch($sqlWalker).')';
}


} 

在我的config.yml中,我有以下内容:

    orm:
    auto_generate_proxy_classes: %kernel.debug%
    entity_managers:
        default:
            mappings:
                ..........
                tree:
            loggable:
                    .......
        dql:
            numeric_functions:
                TO_NUMBER: My_project\MyBundle\DoctrineFunctions\ToNumberFunction

2 个答案:

答案 0 :(得分:1)

试试这样:

orm:
    auto_generate_proxy_classes: %kernel.debug%
    entity_managers:
        default:
            mappings:
                ..........
                tree:
            loggable:
                .......
            dql:
                numeric_functions:
                    TO_NUMBER: My_project\MyBundle\DoctrineFunctions\ToNumberFunction

或者像这样:

orm:
    auto_generate_proxy_classes: %kernel.debug%
    default_entity_manager:  default
    dql:
        numeric_functions:
            TO_NUMBER: My_project\MyBundle\DoctrineFunctions\ToNumberFunction

如果您没有多元化的实体经理,则无需声明:

default_entity_manager:  default.

http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html

答案 1 :(得分:0)

看起来Doctrine代码工作正常,但TO_NUMBER不是您正在使用的数据库识别的功能。

TO_NUMBER似乎是Oracle SQL特定的函数,因此如果您使用的是另一个可能是您问题的SQL数据库。