2012-10-17 72 views
-1

中的實體存儲庫:學說2.2雙類型功率

$qb = $this->createQueryBuilder('c'); 
//.... 
$qb->addSelect('POWER('.$qb->expr()->abs(
       $qb->expr()->diff('c.latitude', $filter['latitude']) 
      ).',2) AS ddst'; 
//.... 
return $qb->getQuery(); //to Pagerfanta with DoctrineORMAdapter 

錯誤:

QueryException: [Syntax Error] line 0, col 11: Error: Expected known function, got 'POWER' 

QueryException: SELECT c, (POWER(ABS(c.delivery_latitude - 47.227163),2) AS ddst 
FROM MyEntity c ORDER BY ddst ASC, c.created_at DESC (this is dql error) 

有什麼不對? Dql不支持POWER。我沒有在qb-expressions中找到它。

+1

你的問題是什麼?你實際上知道它爲什麼不起作用,'POWER'函數不是原生的'DQL'函數。你必須自己寫,並將其添加到Doctrine2。 (http://docs.doctrine-project.org/en/2.1/cookbook/dql-user-defined-functions.html) –

+0

好的。我會嘗試給DQL添加POWER。其實我認爲DQL支持某種形式的SQL數學函數。 Cuz原生查詢對我不好。我不知道,如何將NQ傳遞給Pagerfanta)) 但是,謝謝。 – ZloyPotroh

回答

1

而且......也許這將是有益的人。答:

//app/config/config.yml 

doctrine: 
    dbal: 
     #.....  
    orm: 
     auto_generate_proxy_classes: %kernel.debug% 
     # auto_mapping: true #comment this line if isset 
     entity_managers: 
      default: 
       auto_mapping: true #from orm to here or custom mapping 
       dql: 
        numeric_functions: 
         power: Acme\MyBundle\DQL\PowerFunction #or power_num: ... it's an identifier 

的src/Acme的/ MyBundle/DQL/PowerFunction.php:

<?php 
namespace Acme\MyBundle\DQL; 

use Doctrine\ORM\Query\Lexer; 

class PowerFunction extends \Doctrine\ORM\Query\AST\Functions\FunctionNode 
{ 
    public $numberExpression = null; 
    public $powerExpression = 1; 

    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 
     //Check for correct 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->numberExpression = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_COMMA); 
     $this->powerExpression = $parser->ArithmeticPrimary(); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
     return 'POWER(' . 
      $this->numberExpression->dispatch($sqlWalker) . ', ' . 
      $this->powerExpression->dispatch($sqlWalker) . ')'; 
    } 
} 

,並使用(在MyEntityRepository):

$qb = $this->createQueryBuilder('c'); 
//some code 
$qb->addSelect('power('.$yourNumber.',2) AS powered_num'); 
//'power' must be in lowercase!!!; if idetifier in config for example, 'power_num', then write 'power_num($yournumber,2)' 

//some code ... 

return $qb->getQuery(); //or getResult() 

完成。

1

我定了同樣的問題感謝這個軟件包:

https://github.com/orocrm/doctrine-extensions

這裏是處理方式。

1)安裝庫:

composer require oro/doctrine-extensions 

2)添加DQL功能,以您的學說配置:

doctrine: 
    orm: 
     dql: 
      numeric_functions: 
       pow: Oro\ORM\Query\AST\Functions\Numeric\Pow 

這就是全部。

現在學說知道如何處理SQL POW函數。