我有这样的表格
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 ==> 2UI0392DJPO ==> 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 实例作为结果(或者如果您知道将查询转换为 QueryBuilder 实例的方法?
谢谢
你在那里做的事情本身看起来并没有错。不过,这是一个非常简单的查询分组,实际上不需要扩展任何类。不妨一击而出。
这将正常工作(我对你的实体可能被称为什么做了一些假设):
$yourCount = $qb->select('count(a.adkey) as adKeyCount, a.adKey')
->from('YourBundle:YourAdKeyEntity', 'a')
->groupBy('a.adKey')
->getQuery()
->getResult();
选择 AdKey 实体是没有意义的,因为无论如何您只会获得其中一个分组实体。