2

IfFunction を DQL に追加するつもりですが、うまくいきません:

//My DQL Class
<?php

namespace Application\HappyBundle\DQL;

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

/**
 * IFFunction ::= "IF" "( "ArithmeticPrimary" , "ArithmeticPrimary" ,  "ArithmeticPrimary" )"
 */
class IFFunction extends FunctionNode
{
    // (1)
    public $firstNumericExpression = null;
    public $secondNumericExpression = null;
    public $thirdNumericExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {

        $parser->match(Lexer::T_IDENTIFIER); // (2)
        $parser->match(Lexer::T_OPEN_PARENTHESIS); // (3)
        $this->firstNumericExpression = $parser->ArithmeticPrimary(); // (4)
        $parser->match(Lexer::T_COMMA); // (5)
        $this->secondNumericExpression = $parser->ArithmeticPrimary(); // (6)
        $parser->match(Lexer::T_COMMA); // (5)
        //$parser->match(Lexer::T_CLOSE_PARENTHESIS); // (3)
        $this->thirdNumericExpression = $parser->ArithmeticPrimary(); // (6)
        $parser->match(Lexer::T_CLOSE_PARENTHESIS); // (3)

    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'IF(' .
            $this->firstNumericExpression->dispatch($sqlWalker) . ', ' .
            $this->secondNumericExpression->dispatch($sqlWalker) . ', ' .
            $this->thirdNumericExpression->dispatch($sqlWalker) .
        ')';
    }
}

//config.yml での宣言

        dql:
            datetime_functions:
                timediff: Application\HappyBundle\DQL\TimeDiff  
                addtime: Application\HappyBundle\DQL\AddTime    
            numeric_functions:
                IF: Application\HappyBundle\DQL\IFFunction            

DQL関数の追加は機能しますが、例として行うつもりの場合:

SELECT IF(1<2,'oui','non');

char '<' にエラーがあります If 関数をこのように配置すると

SELECT IF('1<2','oui','non');

それは機能しますが、最初の条件を評価しません:(

誰かがアイデアを持っている場合...助けてくれてありがとう。

4

1 に答える 1