php - doctrine2 中的自定义 DQL 函数

标签 php mysql symfony doctrine-orm php-5.4

如何在部分中使用自定义 DQL 函数来合成查询结果。

寻找一种在 createQuery 或任何其他学说方式(nativeSql、QueryBuilder)中使用 DQL 函数的方法,它没有必要使用部分,但它应该根据表的关系来补充我的数组,它应该只选择选择性字段

以下查询工作正常:

$q = $em->createQuery("select "
                . "partial t.{id, description}, "
                . "partial ut.{id, firstName, lastName, email}, "
                . "DATE_FORMAT(ut.created, '%m-%d-Y') "
                . "from PMIUserBundle:Task t LEFT JOIN t.users ut");

DATE_FORMAT(ut.created, '%m-%d-Y') 在非部分时工作正常。

DATE_FORMAT 已在 config.yml 中注册为自定义函数

配置文件:

dql:
            datetime_functions:
                DATE_FORMAT: PMI\UserBundle\DoctrineFunctions\DateFormat

以下查询会产生问题:

 $q = $em->createQuery("select "
                . "partial t.{id, description}, "
                . "partial ut.{id, firstName, lastName, email, DATE_FORMAT(created, '%m-%d-Y')}, "
                . "DATE_FORMAT(ut.created, '%m-%d-Y') "
                . "from PMIUserBundle:Task t LEFT JOIN t.users ut");

给出错误:

[Syntax Error] line 0, col 91: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_CURLY_BRACE, got '(' 

以下是我的 DateFormat 类:

class DateFormat extends \Doctrine\ORM\Query\AST\Functions\FunctionNode {



    protected $dateExpression;

    protected $formatChar;

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) {

         return 'DATE_FORMAT('.
                $sqlWalker->walkArithmeticExpression($this->dateExpression) .
                ','.
                $sqlWalker->walkStringPrimary($this->formatChar).
                ')';



    }

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

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

        $this->dateExpression = $parser->ArithmeticExpression();
        $parser->match(Lexer::T_COMMA);


        $this->formatChar = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);


    }

}

编辑:

好的,所以 Partial 不允许我使用 DQL 函数。感谢FuzzyTree在我的实体类中使用 ut->getFormattedCreatedDate() 的解决方案。但我仍然很好奇,如果我们对子表进行分组并使用 mysql 聚合函数计算一些数量会怎样。

如何使用 createQuery、queryBuilder、nativeSQl 或任何其他方式在 doctrine2 中实现以下标准:

  1. 仅选择选择性字段
  2. 使用聚合函数按子表实体分组
  3. Hydrate 数组基于表关系,聚合函数结果 应该在子数组中。

每次如果我们使用 DQL 函数,我们是否必须像我为 DateFormat 创建的那样创建类?如果我们使用像

这样的嵌套 MySql 函数怎么办
GROUP_CONCAT(DISTINCT CONCAT(tags.id,',',tags.displayName)

感谢您阅读我的问题。

最佳答案

How do you use custom DQL functions in partials to hydrate query result.

partial 关键字告诉 doctrine 返回仅部分水合的实体,并允许您指定要水合的字段。

当检索部分实体时,您只能选择实体的字段(因为否则学说会在哪里“存储”您选择的字段?),因此不可能将 DQL 函数指定为部分实体的字段对象。

关于php - doctrine2 中的自定义 DQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799971/

相关文章:

php - 新电子邮件仅适用于 Imap 和 PHP

mysql - 在 MySQL 数据库中存储货币值的最佳数据类型

css - Drupal block Twig 文件

forms - 以 symfony 形式按字母顺序对组进行排序

php - 即使用户名错误,MySQL 连接功能也会运行

symfony - 显示使用的配置和参数文件

php - Grocery Crud 中两个字段作为一个独特字段

php - Left Join With Null 值表

php - Laravel Eloquent : Update A Model And its Relationships

javascript - 使用javascript(codeigniter)以动态形式插入数据库