2011-08-25 20 views
55

Bunun benim proje üzerinde bir blog bölüm ile ilgili tüm kategoriler alır bu symfony kodu vardır:Symfony2 doktrin sorgu oluşturucusu kullanarak ayrı sorgu nasıl seçilir?

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

$categories = $category->getResult(); 

Bu çalışır, ancak sorgu çiftleri içerir:

Test Content 
Business 
Test Content 

kullanmak istediğim Sorgumda DISTINCT komutu. Gördüğüm tek örnek, ham SQL yazmamı gerektiriyor. Tüm kodlarımın aynı kalmasını sağlamaya çalıştığımdan mümkün olduğunca kaçınmak istiyorum, böylece hepsi Symfony2/Doctrine tarafından sağlanan QueryBuilder özelliğini kullanıyor.

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

$categories = $category->getResult(); 

Ama aşağıdaki hatası:

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

nasıl ayrı seçmek için Symfony söyleyeceğiz

Bu gibi benim sorguya distinct() ekleyerek çalıştı?

+1

Sen ayrı() işlevine bir boolean değer geçirerek edilmelidir. http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_distinct – Omn

cevap

22

sen şey, sadece şu anda kendimi Doktrin içine alıyorum olduğunu

select DISTINCT f from t; 

select f from t group by f; 

olarak yazabilirsiniz, bu yüzden size gerçek bir cevap veremez. ama yukarıda gösterildiği gibi, group by ile farklı bir simülasyon yapabilir ve bunu Doctrine'a dönüştürebilirsiniz. Daha fazla filtreleme eklemek isterseniz, gruptan sonra HAVING kullanın. Eğer "seçeneğini()" deyimi kullanırsanız

+0

@mickburkejnr Bir ORDER yan tümcesi ekleyene kadar. :( – undefined

+0

@ xyu Biliyorum, bu gerçekten ideal değil mi? Neden böyle bir şeyle karşılaşmamalıyız? Neden sadece işe yaramaz? – mickburkejnr

+0

@mickburkejnr Gruplama, SQL'de sipariş vermeden önce gerçekleşir. – undefined

42

, bunu yapabilirsiniz:

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

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

Bu çalışır:

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

$categories = $category->getResult();