如何使用symfony2原则查询构建器选择不同的查询?


76

我有这个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选择与众不同?


2
您应该将一个布尔值传递给distinct()函数。doctrine-project.org/api/orm/2.2/...
OMN

Answers:


31

你可以写

select DISTINCT f from t;

select f from t group by f;

事情是,我现在只是我自己正在学习教义,所以我不能给您真正的答案。但是您可以如上所示,使用group by模拟一个独特对象并将其转换为Doctrine。如果要添加进一步的过滤,请HAVING在分组依据之后使用。


1
@mickburkejnr,直到您添加ORDER子句。:(
undefined

1
@xyu我知道,这真的不理想吗?为什么我们要沉迷于这样的事情?为什么不能正常工作?
mickburkejnr,2012年

1
@mickburkejnr分组是在订购SQL之前进行的。
未定义的2012年

11
仅当您使用sql语句而不是查询生成器时,这才是正确的答案。这不应标记为@skler提供的解决方案正确的答案。
汤姆T

2
(旧评论,我知道...)。@汤姆·T:实际上,这个答案是有效的。就是说,与其尝试使用实际 DISTINCT关键字,GROUP BY不如通过在QueryBuilder中使用进行模拟。但是,他没有给出一个例子。这是一个简单的$q = $db->createQueryBuilder(); $q->select('f')->from('t', 't')->groupBy('f');
例子

173

这有效:

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

$categories = $category->getResult();

编辑Symfony 3和4。

您应该使用->groupBy('cc.categoryid')而不是->distinct()


54

如果使用“ select()”语句,则可以执行以下操作:

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

$categories = $category->getResult();

-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
    ]);
}

祝好运!


“没有工作”是什么意思?会发生什么呢?当查询生成器是Doctrine的一部分时,为什么这应该是Symfony的问题?
Nico Haase

@NicoHaase,因为通过composer创建一个新的Symfony项目将安装Twig和Doctrine的最新版本,这就是为什么我提到我的解决方案已通过Symfony5及其附带的任何Doctrine版本进行了测试。希望现在更加清楚。
阿里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.