我有这个symfony代码,它检索与我项目上的博客部分相关的所有类别:
$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();
但是会导致以下错误:
致命错误:调用未定义的方法Doctrine \ ORM \ QueryBuilder :: distinct()
如何告诉symfony选择distinct?
答案 0 :(得分:158)
这有效:
$category = $catrep->createQueryBuilder('cc')
->select('cc.categoryid')
->where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->distinct()
->getQuery();
$categories = $category->getResult();
答案 1 :(得分:49)
如果使用“select()”语句,则可以执行以下操作:
$category = $catrep->createQueryBuilder('cc')
->select('DISTINCT cc.contenttype')
->Where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->getQuery();
$categories = $category->getResult();
答案 2 :(得分:27)
select DISTINCT f from t;
作为
select f from t group by f;
事情是,我目前正在进入Doctrine,所以我不能给你一个真正的答案。但您可以如上所示,使用group by模拟不同的内容并将其转换为Doctrine。如果您想要添加进一步过滤,请在分组后使用HAVING
。
答案 3 :(得分:-1)
只需打开您的存储库文件并添加此新函数,然后在您的控制器中调用它即可:
public function distinctCategories(){
return $this->createQueryBuilder('cc')
->where('cc.contenttype = :type')
->setParameter('type', 'blogarticle')
->groupBy('cc.blogarticle')
->getQuery()
->getResult()
;
}
然后在您的控制器内:
public function index(YourRepository $repo)
{
$distinctCategories = $repo->distinctCategories();
return $this->render('your_twig_file.html.twig', [
'distinctCategories' => $distinctCategories
]);
}
祝你好运!