Как выбрать отдельный запрос, используя конструктор запросов symfony2? - PullRequest
68 голосов
/ 25 августа 2011

У меня есть этот код 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 :: Different ()

Как мне сказать Symfony выбирать разные?

Ответы [ 3 ]

160 голосов
/ 22 октября 2013

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

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

$categories = $category->getResult();
51 голосов
/ 25 января 2012

Если вы используете оператор «select ()», вы можете сделать это:

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

$categories = $category->getResult();
29 голосов
/ 25 августа 2011

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

select DISTINCT f from t;

в

select f from t group by f;

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

...