在Symfony2中的查询中使用自定义DQL函数

时间:2013-10-29 08:50:06

标签: symfony orm doctrine-orm

我添加了以下查询扩展名:

<?php

/*
 * DoctrineExtensions Mysql Function Pack
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to kontakt@beberlei.de so I can send you a copy immediately.
 */

namespace MyApp\MainBundle\DQL;

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

/**
 * "DAY" "(" SimpleArithmeticExpression ")". Modified from DoctrineExtensions\Query\Mysql\Year
 *
 * @category    DoctrineExtensions
 * @package     DoctrineExtensions\Query\Mysql
 * @author      Rafael Kassner <kassner@gmail.com>
 * @author      Sarjono Mukti Aji <me@simukti.net>
 * @license     MIT License
 */
class Day extends FunctionNode
{
    public $date;

    /**
     * @override
     */
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return "DAY(" . $sqlWalker->walkArithmeticPrimary($this->date) . ")";
    }

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

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

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

我想在一个小组中使用它,所以在我做的查询中:

->addGroupBy('DAY(v.created)')  

然而它总是给我一个错误:

[Semantical Error] line 0, col 90 near 'DAY(v.create': Error: Cannot group by undefined identification or result variable.

为什么会这样?

2 个答案:

答案 0 :(得分:1)

自此提交以来:https://github.com/doctrine/doctrine2/commit/2642daa43851878688d01625f272ff5874cac7b2

此问题通过SelectExpression + Hidden + ResultVariable refer。

解决
SELECT 
    ..., DAY(t.scheduledDate) AS myDay
FROM Task t
    ...
WHERE
    ...
GROUP BY
    myDay

答案 1 :(得分:1)

如果要对GROUP BY(或ORDER BY)进行GROUP BY(或ORDER BY),则必须在SELECT部分​​中添加计算值。 使用关键字HIDDEN 在提取的结果中忽略此字段!

$qb
    // select...
    ->addSelect('DAY(v.created) AS HIDDEN myGroupByField')
    // ...
    ->groupBy('myGroupByField')
;