Как выбрать отдельный запрос с помощью построителя запросов symfony2 doctrine?


У меня есть этот код symfony, в котором он извлекает все категории, связанные с разделом блога в моем проекте:

$category = $catrep->createQueryBuilder('cc')
    ->Where('cc.contenttype = :type')
    ->setParameter('type', 'blogarticle')
    ->getQuery();

$categories = $category->getResult();

Это работает, но запрос содержит дубликаты:

Test Content
Business
Test Content

Я хочу использовать команду DISTINCT в своем запросе. Единственные примеры, которые я видел, требуют, чтобы я писал необработанный SQL. Я хочу избежать этого, насколько это возможно, поскольку я пытаюсь сохранить весь свой код одинаковым, чтобы все они использовали функцию QueryBuilder, предоставляемую Symfony2/Doctrine.

Я попытался добавить distinct() на мой запрос вот так:

$category = $catrep->createQueryBuilder('cc')
    ->Where('cc.contenttype = :type')
    ->setParameter('type', 'blogarticle')
    ->distinct('cc.categoryid')
    ->getQuery();

$categories = $category->getResult();

Но это приводит к следующей ошибке:

Неустранимая ошибка: Вызов неопределенного метода Doctrine\ORM\QueryBuilder::distinct()

Как мне указать symfony выбрать distinct?

Author: Eric Leschinski, 2011-08-25

3 answers

Вы могли бы написать

select DISTINCT f from t;

Как

select f from t group by f;

Дело в том, что в настоящее время я сам только начинаю изучать Доктрину, поэтому я не могу дать вам реальный ответ. но вы могли бы, как показано выше, смоделировать различие с помощью group by и преобразовать его в Доктрину. если вы хотите добавить дополнительную фильтрацию, используйте HAVING после group by.

 26
Author: Raffael, 2011-08-25 13:38:46

Это работает:

$category = $catrep->createQueryBuilder('cc')
        ->select('cc.categoryid')
        ->where('cc.contenttype = :type')
        ->setParameter('type', 'blogarticle')
        ->distinct()
        ->getQuery();

$categories = $category->getResult();
 149
Author: skler, 2013-10-22 16:32:39

Если вы используете оператор "select()", вы можете сделать следующее:

$category = $catrep->createQueryBuilder('cc')
    ->select('DISTINCT cc.contenttype')
    ->Where('cc.contenttype = :type')
    ->setParameter('type', 'blogarticle')
    ->getQuery();

$categories = $category->getResult();
 46
Author: Chris, 2012-05-08 06:45:18