Passing a large amount of diverse information in JSON using Symfony 2.1 and Doctrine 2 For a project I need to give a load of diverseinformation in JSON format. All the information will be used on the same page so a single call would result in the least overhead. The information all concerns the same database object and is all nescessary on the page. It basically is a collection of counts of the amount of objects that are of one or more of a certain type (the types are all booleans) and we require to know a lot of different variations of this. I used the code below but my co-worker believes the way I put it in the JSON list is a bit clunky and the code could be far more performant. How could I improve this code?

public function getContactsStatisticsAction()
{
    $response = new Response();
    $json = array();
    $em = $this-&gt;getDoctrine()-&gt;getEntityManager();
    $cr = $em-&gt;getRepository('BlaCoreBundle:Company');

    $json['numberOfCompanies'] = $cr-&gt;numberOfCompanies();
    $json['numberOfAccounts'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; true));
    $json['numberOfCompetitors'] = $cr-&gt;numberOfCompanies(array("typeCompetitor" =&gt; true));
    $json['numberOfSuppliers'] = $cr-&gt;numberOfCompanies(array("typeSupplier" =&gt; true));
    $json['numberOfOthers'] = $cr-&gt;numberOfCompanies(array("typeOther" =&gt; true));
    $json['numberOfUnassigned'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; false, "typeCompetitor" =&gt; false,"typeSupplier" =&gt; false,"typeOther" =&gt; false));

    $json['numberOfJustAccounts'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; true, "typeCompetitor" =&gt; false, "typeSupplier" =&gt; false));
    $json['numberOfJustCompetitors'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; false, "typeCompetitor" =&gt; false, "typeSupplier" =&gt; false));
    $json['numberOfJustSuppliers'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; false, "typeCompetitor" =&gt; false, "typeSupplier" =&gt; false));

    $json['numberOfCompetitorAndAccounts'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; true, "typeCompetitor" =&gt; true, "typeSupplier" =&gt; false));
    $json['numberOfCompetitorAndSuppliers'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; false, "typeCompetitor" =&gt; true, "typeSupplier" =&gt; true));
    $json['numberOfSupplierAndAccounts'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; true, "typeCompetitor" =&gt; false, "typeSupplier" =&gt; true));
    $json['numberOfCompaniesAndAccountsAndSuppliers'] = $cr-&gt;numberOfCompanies(array("typeAccount" =&gt; true, "typeCompetitor" =&gt; true, "typeSupplier" =&gt; true));

    $response-&gt;setContent(json_encode($json));
    return $response;
}


public function numberOfCompanies($filters = array())
{
    $qb = $this-&gt;getEntityManager()-&gt;createQueryBuilder();
    $qb-&gt;select('count(c.id)');
    $qb-&gt;from('BlaCoreBundle:Company', 'c');
    $sizeFilters = count ($filters);
    $keys = array_keys($filters);
    if($sizeFilters &gt;= 1){
        $qb-&gt;where('c.' . $keys[0] . ' = ' . (int) $filters[$keys[0]]);
    }
    for($i = 1; $i &lt; $sizeFilters; $i++){
        $qb-&gt;andWhere('c.' . $keys[$i] . ' = ' . (int) $filters[$keys[$i]]);
    }
    return $qb-&gt;getQuery()-&gt;getSingleScalarResult();
}
I think that what you have is probably fine. Personally, I'd move the construction of the result array to a view but this is not that big of a deal. That might help with the "clunkiness".

With regards to your concern about the size of the json response: You say that all of the information in it is needed by the app. It doesn't look all that big to me. Unless you are actually experiencing problems as a result of the size, I'd leave it alone. If it were too big, you could consider implementing appropriate caching (allow the browser to cache the results and/or use etags) or pagination.

Regarding the number of individual sql calls: I'm sure you could put it all into one query if need be.

Both of these potential issues, response size and number of queries, seem to me to be pre-optimization concerns. In the past, I've spent lots of time pre-optimizing stuff and never realized any real gain. Now, I implement what is needed and only optimize when the real need arises. The bottom line: I don't see any problems with what you've got and unless the result is unacceptably slow or resource intensive, don't worry about it.

Hope it helps.