Symfony 2& Doctrine:通过返回false结果选择count和group

时间:2016-04-25 08:29:21

标签: symfony doctrine-orm doctrine

我有一张这样的表

ID       |   ADKEY    |  IP       |  CREATED_AT
1        | NS0392DJEJ | 127.0.0.1 | 2016-04-25 09:00:00
2        | NS0392DJEJ | 127.0.0.1 | 2016-04-25 09:20:00
3        | UI0392DJPO | 127.0.0.1 | 2016-04-25 09:30:00

目标是每次有人点击网站上的广告时添加新行。

我的问题是我希望通过广告获得点击次数(广告的名称是adkey列)

在我的例子中,我应该得到 NS0392DJEJ ==> 2 UI0392DJPO ==> 1

但是通过以下请求,计数始终为1

首先,全局getQueryBuilder()

 */
public function getQueryBuilder()
{
    $queryBuilder = $this->getEntityManager()->createQueryBuilder();
    $queryBuilder
        ->select('e')
        ->from($this->getEntityClass(), 'e')
        ->orderBy('e.id', 'DESC');
    return $queryBuilder;
}

然后,我将其扩展到我的子课程

public function getQueryBuilder()
{
    $qb = parent::getQueryBuilder();
    $qb->addSelect( $qb->expr()->count('e.id') . 'as adCount');
    $qb->addGroupBy('e.adkey');
}

当我分析请求时,我注意到Doctrine首先请求获取id,然后使用这些id来执行计数请求

SELECT 
  DISTINCT id0 
FROM 
  (
    SELECT 
      a0_.id AS id0, 
      a0_.adkey AS adkey1, 
      a0_.ip AS ip2, 
      a0_.created_at AS created_at3, 
      COUNT(a0_.id) AS sclr4 
    FROM 
      advertiser_clickcounter a0_ 
    GROUP BY 
      a0_.adkey 
    ORDER BY 
      a0_.id DESC
  ) dctrn_result 
LIMIT 
  30 OFFSET 0

然后

SELECT 
  a0_.id AS id0, 
  a0_.adkey AS adkey1, 
  a0_.ip AS ip2, 
  a0_.created_at AS created_at3, 
  COUNT(a0_.id) AS sclr4 
FROM 
  advertiser_clickcounter a0_ 
WHERE 
  a0_.id IN (?) 
GROUP BY 
  a0_.adkey 
ORDER BY 
  a0_.id DESC
Parameters: [['5', '4', '2']] 

你有什么建议吗?这样做的正确方法是什么? 知道我需要一个QueryBuilder实例作为结果(或者你知道一种将Query转换为QueryBuilder实例的方法吗?)

谢谢

1 个答案:

答案 0 :(得分:2)

你在做什么本身并没有错。这是一个非常简单的查询组,但是没有必要扩展任何类。也可以一击即可。

这样可以正常工作(我对你的实体可能被明显调用的内容做了一些假设):

    $yourCount = $qb->select('count(a.adkey) as adKeyCount, a.adKey')
        ->from('YourBundle:YourAdKeyEntity', 'a')
        ->groupBy('a.adKey')
        ->getQuery()
        ->getResult();

选择AdKey实体毫无意义,因为您只会获得其中一个分组实体。