Doctrine 2.2 DQL DATE GROUP BY

时间:2014-01-12 20:47:00

标签: php date symfony doctrine-orm

我正在尝试执行此查询:

public function historyLoginAction() {
    $em    = $this->get('doctrine.orm.entity_manager');
    $em->getConfiguration()->addCustomDatetimeFunction('DATE', 'TB\UserBundle\DQLFunctions\DateFunction');

    $dql   = "SELECT COUNT(u.id),u.lastLogin, DATE(u.lastLogin) AS groupDate FROM UserBundle:User u GROUP BY groupDate ORDER BY u.lastLogin DESC";

    $query = $em->createQuery($dql);

    $paginator  = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query,
        $this->get('request')->query->get('page', 1)/*page number*/,
        12/*limit per page*/
    );

DateFunction:

<?php

namespace TB\UserBundle\DQLFunctions;

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

class DateFunction extends FunctionNode
{
    private $arg;

    public function getSql(SqlWalker $sqlWalker)
    {
        return sprintf('DATE(%s)', $this->arg->dispatch($sqlWalker));
    }

    public function parse(Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);

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

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

根据这些页面......

Use a DATE() function in a WHERE clause with DQL

Doctrine: Group by date ranges

http://www.doctrine-project.org/jira/browse/DDC-1236

当我在$ paginator

之前var_dump查询结果时
    var_dump($query->getResult());die;

我得到了我的输出(所以DQL很好吗?)

array
  0 => 
    array
      1 => string '1' (length=1)
      'lastLogin' => 
        object(DateTime)[968]
          public 'date' => string '2014-01-11 16:31:46' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Berlin' (length=13)
      'groupDate' => string '2014-01-11' (length=10)
  1 => 
    array
      1 => string '1' (length=1)
      'lastLogin' => 
        object(DateTime)[988]
          public 'date' => string '2013-10-15 21:05:31' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Berlin' (length=13)
      'groupDate' => string '2013-10-15' (length=10)
  2 => 

但是当我将查询传递给paginator时,我得到了:

Notice: Undefined index: groupDate in /vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php line 2197

使用:

    "knplabs/knp-paginator-bundle": "2.3.3",
    "knplabs/knp-components": "1.2.4"

我错过了什么?

2 个答案:

答案 0 :(得分:1)

试试这个。 以下是一些解决方案和类似问题 http://www.programmingrelief.com/4151523/Symfony2-Doctrine-Group-By Symfony2 doctrine GROUP BY

SELECT COUNT(u.id),
u.lastLogin,
DATE(u.lastLogin) AS groupDate 
CAST(u.lastLogin as date) AS HIDDEN groupDateGrp 
FROM UserBundle:User u 
GROUP BY DATE(groupDateGrp) 
ORDER BY u.lastLogin DESC

答案 1 :(得分:0)

我的问题已经解决了。我的查询结果与KNP不兼容我猜我做了什么?

$pagination = $paginator->paginate(
    $query,

已更改为

$result = $query->getResult();    

$pagination = $paginator->paginate(
    $result,