2016-02-01 3 views
1

Я строю диаграмму с информацией, взятой из базы данных, содержащей названия городов. В настоящее время я подсчитываю, сколько раз в базе данных появляется каждое отдельное название города.Очень неэффективный DQL-запрос в Symfony2 с Doctrine. Нужно улучшить

Как я сделал это:

Я нахожу название городов в базе данных и протолкнул результат $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; 

ответ

1

Это должно помочь вам ... использовать GroupBy группе городов затем подсчитать экземпляры.

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