2011-08-25 15 views
55

Mam ten kod symfony gdzie pobiera wszystkie kategorie związane z sekcji blogu na moim projekcie:Jak wybrać oddzielne zapytanie za pomocą konstruktora zapytań doktryny Symfony2?

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

$categories = $category->getResult(); 

To działa, ale kwerenda zawiera duplikaty:

Test Content 
Business 
Test Content 

chcę użyć DISTINCT polecenie w moim zapytaniu. Jedyne przykłady, jakie widziałem, wymagają napisania surowego kodu SQL. Chcę tego uniknąć tak bardzo, jak to tylko możliwe, ponieważ staram się zachować cały mój kod tak samo, aby wszyscy korzystali z funkcji QueryBuilder dostarczanej przez Symfony2/Doctrine.

Próbowałem dodanie distinct() do mojego zapytania tak:

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

$categories = $category->getResult(); 

Ale to prowadzi do następującego błędu:

Fatal error: Call to undefined method Doctrine\ORM\QueryBuilder::distinct()

Jak mogę powiedzieć symfony, aby wybrać odrębny?

+1

powinien być przechodzącą wartość logiczną do odrębnego function(). http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_distinct – Omn

Odpowiedz

22

można napisać

select DISTINCT f from t; 

jak

select f from t group by f; 

rzeczą jest, jestem po prostu obecnie sam wsiada do doktryny, więc nie mogę dać prawdziwą odpowiedź. ale możesz, jak pokazano powyżej, zasymulować odrębne z group by i przekształcić go w Doctrine. jeśli chcesz dodać dalsze filtrowanie, użyj HAVING po grupie według.

+0

@mickburkejnr Dopóki nie dodasz klauzuli ORDER. :( – undefined

+0

@xyu Wiem, to nie jest idealny, naprawdę to jest to, dlaczego powinniśmy być obciążeni czymś takim jak to? Dlaczego nie może to po prostu zadziałać? – mickburkejnr

+0

@mickburkejnr Grupowanie odbywa się przed złożeniem zamówienia w SQL – undefined

42

Jeśli używasz "wybrać()" oświadczenie, można to zrobić:

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

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

To działa:

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

$categories = $category->getResult(); 
Powiązane problemy