我有一张这样的表
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实例的方法吗?)
谢谢
答案 0 :(得分:2)
你在做什么本身并没有错。这是一个非常简单的查询组,但是没有必要扩展任何类。也可以一击即可。
这样可以正常工作(我对你的实体可能被明显调用的内容做了一些假设):
$yourCount = $qb->select('count(a.adkey) as adKeyCount, a.adKey')
->from('YourBundle:YourAdKeyEntity', 'a')
->groupBy('a.adKey')
->getQuery()
->getResult();
选择AdKey实体毫无意义,因为您只会获得其中一个分组实体。