加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php – Doctrine:如何添加带可选参数的自定义函数?

发布时间:2020-05-25 09:02:20 所属栏目:PHP 来源:互联网
导读:在官方解释之后,我想创建我的自定义 MySQL函数ROUND(),它可以采用(非强制性的)另一个第二个参数. 我已经完成了这个: ?phpnamespace HQFBundlePizzasBundleDQL;use DoctrineORMQueryASTFunctionsFunctionNode;use DoctrineORMQueryLexer;class

在官方解释之后,我想创建我的自定义 MySQL函数ROUND(),它可以采用(非强制性的)另一个第二个参数.

我已经完成了这个:

<?php
namespace HQFBundlePizzasBundleDQL;

use DoctrineORMQueryASTFunctionsFunctionNode;
use DoctrineORMQueryLexer;

class MysqlRound extends FunctionNode
{
    public $simpleArithmeticExpression;

    public function getSql(DoctrineORMQuerySqlWalker $sqlWalker)
    {
        return 'ROUND(' . $sqlWalker->walkSimpleArithmeticExpression(
            $this->simpleArithmeticExpression
        ) . ')';
    }

    public function parse(DoctrineORMQueryParser $parser)
    {
        $lexer = $parser->getLexer();

        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

        $this->simpleArithmeticExpression = $parser->SimpleArithmeticExpression();

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

但是如何实现ROUND(XX)没问题,ROUND(XX,YY)也可以呢?

你需要声明第二个参数,并像这样使用Lexer:
namespace HQFBundlePizzasBundleDQL;

use DoctrineORMQueryASTFunctionsFunctionNode;
use DoctrineORMQueryLexer;

class MysqlRound extends FunctionNode
{
    private $firstExpression = null;
    private $secondExpression = null;

    public function parse(DoctrineORMQueryParser $parser)
    {
        $lexer = $parser->getLexer();
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->firstExpression = $parser->ArithmeticPrimary();

        // parse second parameter if available
        if(Lexer::T_COMMA === $lexer->lookahead['type']){
            $parser->match(Lexer::T_COMMA);
            $this->secondExpression = $parser->ArithmeticPrimary();
        }

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

    public function getSql(DoctrineORMQuerySqlWalker $sqlWalker)
    {
        // use second parameter if parsed
        if (null !== $this->secondExpression){
            return 'ROUND(' 
                . $this->firstExpression->dispatch($sqlWalker)
                . ','
                . $this->secondExpression->dispatch($sqlWalker)
                . ')';
        }

        return 'ROUND(' . $this->firstExpression->dispatch($sqlWalker) . ')';
    }
}

编辑

许多Doctrine2扩展已被写入here.所有学分都归功于@beberlei的出色工作.许多功能都可用(IFELSE,IFNULL,NULLIF,COS,ACOS等等)但不是全部(ROUND,GREATEST或LEAST都缺失了,但如果需要,你仍然可以自己编写它们.)

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读