Как отсортировать Doctrine DQL Query по количеству или членам отношения?
Я пытаюсь создать запрос для извлечения объектов из базы данных Doctrine, отсортированной по количеству членов определенного отношения "один ко многим".
Более конкретно: у меня есть две сущности: личность и федерация. Человек может быть членом одной федерации (Человек имеет отношения "федерация"), и федерация может иметь n человек (Федерация как отношения "люди").
Я хотел бы создать DQL-запрос, который бы возвращал список федераций, упорядоченный по количеству членов этой федерации. Что-то вроде этого:
SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people]
Это было бы первым шагом. Есть еще один второй шаг, который я не знаю, если это возможно сделать с помощью одного запроса, который будет фильтровать членов отношения до подсчета. Вот так:
SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)]
Этот второй будет оптимальным результатом, но первый удовлетворит мои потребности, если второй случай не выполним в одном запросе.
Заранее спасибо.
2 ответа
В DQL можно использовать 5 агрегатных функций (Doctrine 2.2): AVG
, COUNT
, MIN
, MAX
а также SUM
,
Следующий запрос должен работать:
SELECT f
FROM AcmeStatsBundle:Federation f
LEFT JOIN f.people p
GROUP BY f.id
ORDER BY COUNT(p)
WHERE p.attr = :some_value
Для дополнительной хитрости DQL я предлагаю вам посмотреть официальные документы Doctrine.
Вы могли бы сделать что-то вроде:
public function getFederationsOrderedByNumberOfPeople()
{
return $this->createQueryBuilder('f')
->addSelect('COUNT(p) AS HIDDEN personCount');
->leftJoin('f.people', 'p');
->groupBy('f')
->orderBy('personCount', 'DESC');
}
Ключевое слово HIDDEN было добавлено в Doctrine 2.2, это означает, что выбранное поле не будет в результатах, и в этом случае это означает, что вы просто вернете свои сущности вместо массива.
Ссылка на документацию по DQL SELECT: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html