-1

エンティティ リポジトリ内:

$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式では見つかりませんでした。

4

3 に答える 3

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()

終わり。

于 2012-10-18T02:40:10.623 に答える
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

それで全部です。

これで、Doctrine は SQL POW 関数を処理する方法を理解しました。

于 2015-03-08T10:25:16.087 に答える
0

DQL は SQL ではありません。POWER などのあまり知られていない SQL 関数の多くはサポートされていません。

必要に応じて、ネイティブ SQL クエリを作成できます。詳細については、このドキュメントを参照してください。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html

于 2012-10-17T12:54:13.427 に答える