DQL сложный запрос

Хорошо, у меня есть 2 таблицы, соответствующая структура выглядит следующим образом:

**youtubevideo**
id - int
allViews - relational**views**
id - int
youtubevideo_id - int
viewCount - int
firstFetch - date

Это актуально, что youtubevideo имеет много просмотров. Это представлено OneToMany в сущности Symfony.

Теперь у меня есть 2 даты, давайте назовем их fromDate и toDate. Мне нужно выбрать все youtubevideos и упорядочить их по сумме viewCount просмотров, которые им принадлежат.

И я хочу использовать только те представления, у которых есть дата firstFetch, между fromDate и toDate.

Так что я думаю, что это было бы что-то вроде

SELECT y FROM YTScraperBundle:YouTubeVideo y
JOIN y.allViews v GROUP BY y.id
ORDER BY SUM(v.viewCount) LIMIT 0, 30; <-- or does this need to be an inline select to the specific element?

И я действительно не вижу, как поместить ГДЕ v.firstFetch между fromDate и toDate.

ОБНОВИТЬ

$query = $this->em->createQuery(
"SELECT y, IF(v IS NULL, 0, SUM(v.viewCount)) AS HIDDEN sumviewcount
FROM YTScraperBundle:YouTubeVideo y
LEFT JOIN y.allViews v WITH v.firstFetch BETWEEN :fromDate AND :toDate
GROUP BY y ORDER BY sumviewcount DESC
");
$query->setMaxResults(self::PR_PAGE);
$query->setFirstResult($firstResult);
$query->setParameter('fromDate', $fromDate);
$query->setParameter('toDate', $toDate);

Получение ошибки:

Expected known function, got 'IF'

4

Решение

Вы должны использовать WITH, BETWEENи связать два DateTime объекты в параметризованный запрос:

$result = $this->getDoctrine()->getManager()->createQuery('
SELECT y,
CASE WHEN (v IS NULL) THEN 0 ELSE SUM(v.viewCount) END AS HIDDEN sumviewcount
FROM YTScraperBundle:YouTubeVideo y
LEFT JOIN y.allViews v WITH v.firstFetch BETWEEN :fromDate AND :toDate
GROUP BY y ORDER BY sumviewcount DESC
')->setParameter('fromDate', new \DateTime('12-34-5678 00:00:00')) // Replace this with an ISO date
->setParameter('toDate', new \DateTime('12-34-5678 00:00:00')) // Replace here too
->getResult();

Я объединенный ответ Маттео относительно SUM в мое для потомков. Кредит идет к нему за HIDDEN идея.

3

Другие решения

Для сортировки вы можете использовать HIDDEN Особенности Doctrine2 (доступно с Doctrine 2.2+).

SELECT y,
SUM(v.viewCount) AS HIDDEN sumviewcount
FROM YTScraperBundle:YouTubeVideo y
JOIN y.allViews v
GROUP BY y
ORDER BY sumviewcount
LIMIT 0, 30;

Взгляни на этот статья.

Надеюсь это поможет

3

По вопросам рекламы [email protected]