2011-08-25 107 views
55

我已经在那里它会检索所有相关的博客节上我的项目类别此symfony的代码:如何使用symfony2原则查询生成器来选择不同的查询?

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

$categories = $category->getResult(); 

这工作,但查询包括重复:

Test Content 
Business 
Test Content 

我想使用DISTINCT命令在我的查询中。我见过的唯一示例要求我编写原始SQL。我想尽可能避免这种情况,因为我试图保持所有代码都一样,所以它们都使用Symfony2/Doctrine提供的QueryBuilder功能。

我尝试添加distinct()到我的查询是这样的:

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

$categories = $category->getResult(); 

但它会导致以下错误:

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

我如何告诉symfony中选择不同?

+1

你应该传递一个布尔值不同()函数。 http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_distinct – Omn

回答

22

你可以写

select DISTINCT f from t; 

select f from t group by f; 

的事情是,我只是目前自己进入学说,所以我不能给你一个真正的答案。但你可以如上所示,用group by模拟一个截然不同的东西,并将其转换为Doctrine。如果你想添加进一步的过滤,那么在分组之后使用HAVING

+0

@mickburkejnr在添加ORDER子句之前。 :( – undefined

+0

@xyu我知道,这不是很理想吗?为什么我们应该这样做?为什么它不能正常工作? – mickburkejnr

+0

@mickburkejnr在SQL中排序之前发生分组 – undefined

42

如果使用 “选择()” 语句,你可以这样做:

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

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

这工作:

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

$categories = $category->getResult();