web-dev-qa-db-fra.com

Comment sélectionner une requête distincte à l'aide du constructeur de requêtes symfony2 doctrine?

J'ai ce code symfony où il récupère toutes les catégories liées à une section de blog sur mon projet:

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

$categories = $category->getResult();

Cela fonctionne, mais la requête inclut les doublons:

Test Content
Business
Test Content

Je souhaite utiliser la commande DISTINCT dans ma requête. Les seuls exemples que j'ai vus m'obligent à écrire du SQL brut. Je souhaite éviter cela autant que possible, car j'essaie de garder tout mon code identique afin qu'ils utilisent tous la fonctionnalité QueryBuilder fournie par Symfony2/Doctrine.

J'ai essayé d'ajouter distinct() à ma requête comme ceci:

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

$categories = $category->getResult();

Mais il en résulte l'erreur suivante:

Erreur fatale: appel de la méthode non définie Doctrine\ORM\QueryBuilder :: distinct ()

Comment dire à symfony de sélectionner distinct?

69
mickburkejnr

tu pourrais écrire

select DISTINCT f from t;

comme

select f from t group by f;

le fait est que je suis moi-même en train de me lancer dans la Doctrine, je ne peux donc pas vous donner de réponse réelle. mais vous pouvez, comme indiqué ci-dessus, simuler un distinct avec groupe par et le transformer en Doctrine . si vous souhaitez ajouter davantage de filtrage, utilisez HAVING après group by.

30
Raffael

Cela marche:

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

$categories = $category->getResult();
161
skler

Si vous utilisez l'instruction "select ()", vous pouvez procéder comme suit:

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

$categories = $category->getResult();
51
Chris