如何提高symfony中多重关系的查询性能?

时间:2015-06-18 16:09:46

标签: php mysql symfony

您好我正在为我的应用程序使用symfony 2并使用sg-datatable显示我的数据,现在要使用客户端而不是服务器端并使用此查询来提供数据表:

public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('MyAppBundle:Artist')
        ->createQueryBuilder('c')
        ->select('c.id, c.name, c.sex, c.priority, c.bday, c.bmonth, c.byear')
        ->getQuery()
        ->getArrayResult();

    $cacsData = $em->createQueryBuilder()
        ->select('a.id, r.name as role, c.title as work')
        ->from('MyAppBundle:CastAndCrew', 'q')
        ->innerJoin('q.role', 'r')
        ->innerJoin('q.artists', 'a')
        ->innerJoin('q.content', 'c')
        ->getQuery()
        ->getArrayResult();

    $cacs = array();
    foreach ($cacsData as $cacData) {
        if (!array_key_exists($cacData['id'], $cacs)) {
            $cacs[$cacData['id']] = array();
        }
        $cacs[$cacData['id']][] = $cacData;
    }

    foreach ($entities as &$artist) {
        if (!array_key_exists($artist['id'], $cacs)) {
            continue;
        }

        $roles    = array();
        $contents = array();

        foreach ($cacs[$artist['id']] as $cac) {
            $roles[]    = $cac['role'];
            $contents[] = $cac['work'];
        }

        $artist['role']  = implode('/', array_unique($roles));
        $artist['works'] = implode('<br>', array_unique($contents));
    }

    $encoders    = array(new JsonEncoder());
    $normalizers = array(new GetSetMethodNormalizer());
    $serializer  = new Serializer($normalizers, $encoders);
    $datatable   = $this->get("bbd_datatables.artist");
    $datatable->setData($serializer->serialize($entities, "json"));

    return $this->render('MyAppBundle:Artist:index.html.twig', array(
       "datatable" => $datatable
    ));
}

一切都很好,但问题是查询时间,我的表中有20000多个数据并且它需要250+ ms并且因为客户端它暂停了几秒然后显示数据,任何人都可以建议我如何能够提高绩效?

0 个答案:

没有答案