2014-02-14 68 views
0

我跟随此tuto:http://iksela.tumblr.com/post/4985265226/custom-dql-functions-nvl-convert-to-numberSymfony2 - 未找到自定义DQL功能

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

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).')'; 
} 


} 

在我的配置。 yml,我有以下内容:

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

回答

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 
如果你没有multimple实体管理

不necesary声明:

default_entity_manager: default. 

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

0

它看起来像教条代码工作正常,但TO_NUM BER不是您正在使用的数据库所识别的功能。

TO_NUMBER似乎是Oracle SQL特定功能,所以如果您使用的是不同的SQL数据库,那可能是您的问题。

+0

你也许是对的!不幸的是,我不再编写这个项目。客户决定使用Wordpress ..对他感到羞耻。 无论如何,我认为你是对的,对于下一个人,我建议在“get_sql”方法中使用CAST而不是TO_NUMBER。 对我而言: return'CAST('。$ this-> field-> dispatch($ sqlWalker)。'as UNSIGNED)'; – Delphine