使用 Doctrine 在 Symfony2 中进行非常低效的 DQL 查询。需要改进

Very inefficient DQL query in Symfony2 with Doctrine. Need improving

我正在构建一个图表,其中包含从包含城市名称的数据库中获取的信息。目前,我正在计算每个不同的城市名称在数据库中出现的次数。

我这样做的方法是:

我在数据库中查找城市名称并将结果推送到 $result

然后我继续执行 while 循环,在每次迭代时创建一个查询构建器,然后我 运行 查询以查找城市出现的次数并将结果推送到 $count,然后将$count的值压入包含其对应城市名称的$result

目前数据库中有 30 个城市,这意味着我每次加载页面时 运行 查询 30 个,而且这个数量只会越来越高,谁能指出我在如何减少这个过程的正确方向上,我相当确定可以在找到 $result 的同时找到每个城市的计数,但我不确定如何并且我没有找到任何东西在线。

    $qb = $entityManager->createQueryBuilder();
    $qb->select('accident.city')->distinct();
    $qb->from('VisDatasetBundle:Accident','accident');

    $result = $qb->getQuery()->getResult();
    $i = 0;
    $qb->delete();

    while($i < count($result)){

    $qb = $entityManager->createQueryBuilder();
    $qb->select('count(accident.city)');
    $qb->from('VisDatasetBundle:Accident', 'accident');
    $qb->where('accident.city = \'' . $result[$i]['city'] . '\'');
    $count = $qb->getQuery()->getResult();
    $result[$i]['count'] = $count[0]['1'];
    $qb->delete();
        $i++;
    }

    return $result;

这应该可以帮助您...使用 groupBy 对城市进行分组,然后计算实例数。

$qb = $entityManager->createQueryBuilder();
$qb->select('accident.city','count(accident.city)')
   ->from('VisDatasetBundle:Accident','accident')
   ->groupBy('accident.city');