Symfony - выберите из нескольких таблиц - PullRequest
1 голос
/ 07 января 2012

У меня есть галерея, и для ее отображения мне нужно получить немного информации, например, количество комментариев, рейтинг, избранные и т. Д. Я делаю что-то вроде ниже, но мне это не кажется полезным.Как это сделать лучше?Может быть, есть какой-нибудь способ сделать это в одном запросе, без подзапросов?

Я мог бы добавить в столбцы изображения таблицы, например, количество комментариев, фаворитов и т. Д., Но если что-то пойдет не так, статистика не будет реальной.Считать его каждый раз надежнее.

$images = $this->getDoctrine()->getEntityManager()
    ->createQuery('SELECT img
    FROM AcmeMainBundle:Image img
    WHERE img.category = :category
    ORDER BY img.order ASC, img.id DESC')
    ->setParameter('category', $category)
    ->getResult();



$comments = $this->getDoctrine()->getEntityManager()
    ->createQuery('SELECT i.id, COUNT(i.id) as c_count
    FROM AcmeMainBundle:ImgComment c
    JOIN c.image i
    WHERE i.category = :category
    GROUP BY c.image')
    ->setParameter('category', $category)
    ->getResult();      



$ratings = $this->getDoctrine()->getEntityManager()
    ->createQuery('SELECT i.id, SUM(r.rating) as suma, COUNT(r.rating) as votes
    FROM AcmeMainBundle:ImgRating r
    JOIN r.image i
    WHERE i.category = :category
    GROUP BY r.image')
    ->setParameter('category', $category)
    ->getResult();

1 Ответ

2 голосов
/ 09 января 2012

В большинстве случаев это нормально. Если у вас нет тысяч различных категорий, вам очень повезло, что sql кеширует ваши запросы и результаты. Это также зависит от среднего количества оценок на изображение для расчета. Попробуйте скопировать сгенерированный SQL-запрос и сравнить его с Sql:

EXPLAIN $yourquery

Имейте в виду, что у вас должны быть индексы для полей, которые используются для вычисления подзапроса, которые не обновляются часто (что должно быть в случае с оценками изображений).

Может быть, вы захотите взглянуть на свою статику mysql, подходит ли ваш размер query_cache. Это действительно зависит от размера проекта.

Надеюсь, это немного вам поможет.

...