Как выбрать отдельный запрос, используя конструктор запросов symfony2?

52

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

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

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

Как указать symfony выбрать отдельный?

Теги:
doctrine2
query-builder

3 ответа

23
Лучший ответ

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

select DISTINCT f from t;

а

select f from t group by f;

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

  • 0
    @mickburkejnr Пока вы не добавите предложение ORDER. :(
  • 0
    @xyu Я знаю, это не идеально, правда? Почему мы должны быть с такими вещами? Почему это не может просто работать?
Показать ещё 4 комментария
119

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

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

$categories = $category->getResult();
41

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

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

$categories = $category->getResult();
  • 0
    Это сработало для меня, спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню