カスタム関数を 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')