Как отсортировать 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

Другие вопросы по тегам