1

カスタム関数を 1 回のリターンで返せば機能しますが、それを 2 つの異なるユーザー定義関数に分割したいと考えています。

ここの例に従ってください:

これは、ネストされた関数を使用したクエリの例です

SELECT *
FROM database
WHERE 
    FUNC_1(FUNC_2('field_name'),'constraint_default') = 
        FUNC_1(FUNC_2('value_entered'),'constraint_entered')

例の機能

<?php
namespace Foo\Bundle\FooBundle\DQL\NumericFunction;

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

class BarFunction extends FunctionNode
{
    public $stringExpression = null;
    public $trimValueExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->stringExpression = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_COMMA);

        $this->trimValueExpression = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'FUNC_1(' .
            $this->stringExpression->dispatch($sqlWalker) . ',' .
            $this->trimValueExpression->dispatch($sqlWalker) .
            ')';
    }
}

現在、FUNC_2 は FUNC_1 に非常に近いですが、FUNC_1 が解析された構文を返し、FUNC_2 に必要な構文が削除されていると思われるため、呼び出されることはありません。

<?php
namespace Foo\Bundle\FooBundle\DQL\NumericFunction;

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

class FooFunction extends FunctionNode
{
    public $stringExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->stringExpression = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'FUNC_2(' .
            $this->stringExpression->dispatch($sqlWalker) .
        ')';
    }
}

これで、機能する複合関​​数を作成しました。

<?php
namespace Foo\Bundle\FooBundle\DQL\NumericFunction;

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

class CombinedFunction extends FunctionNode
{
    public $stringExpression = null;
    public $trimValueExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->stringExpression = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_COMMA);

        $this->trimValueExpression = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'FUNC_1(FUNC_2(' .
            $this->stringExpression->dispatch($sqlWalker) . '),' .
            $this->trimValueExpression->dispatch($sqlWalker) .
            ')';
    }
}

しかし、この結合された関数を作成する代わりに、ネストされた 2 つの別個の関数を使用できるかどうかを知りたいですか?

考え?

アップデート:

yml 構成の追加

doctrine:
    dbal:
        ...

    orm:        
        entity_managers:
            foo_manager:
                dql:
                    numeric_functions:
                        FUNC_1: Foo\Bundle\FooBundle\DQL\NumericFunction\BarFunction
                        FUNC_2: Foo\Bundle\FooBundle\DQL\NumericFunction\FooFunction
                        COMB_FUNC: Foo\Bundle\FooBundle\DQL\NumericFunction\CombinedFunction

更新 #2

したがって、FUNC_1 はこれに一致します

FUNC_1(value_of_func_2,'constraint_default')  

FUNC_2 はこれに一致します

FUNC_2('field_name')
4

1 に答える 1

1

FUNC_2 を次のように定義しました。

class FooFunction extends FunctionNode
{
    public $stringExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->stringExpression = $parser->ArithmeticPrimary();

        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'FUNC_2(' .
            $this->stringExpression->dispatch($sqlWalker) . ')';
    }
}

そして、それは私にとって正しいSQLを生成しました: FUNC_1(FUNC_2(123),123) = FUNC_1(FUNC_2(123),123)

于 2013-01-25T13:29:06.707 に答える