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

mic*_*jnr 71 php query-builder symfony doctrine-orm

我有这个symfony代码,它检索与项目上的博客部分相关的所有类别:

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

$categories = $category->getResult();
Run Code Online (Sandbox Code Playgroud)

这有效,但查询包含重复项:

Test Content
Business
Test Content
Run Code Online (Sandbox Code Playgroud)

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

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

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

$categories = $category->getResult();
Run Code Online (Sandbox Code Playgroud)

但它会导致以下错误:

致命错误:调用未定义的方法Doctrine\ORM\QueryBuilder :: distinct()

如何告诉symfony选择distinct?

小智 163

这有效:

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

$categories = $category->getResult();
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 53

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

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

$categories = $category->getResult();
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 29

你可以写

select DISTINCT f from t;
Run Code Online (Sandbox Code Playgroud)

select f from t group by f;
Run Code Online (Sandbox Code Playgroud)

事情是,我现在正在进入Doctrine,所以我不能给你一个真正的答案.但是你可以如上所示,用group by模拟一个独特并将其转换为Doctrine.如果你想添加进一步的过滤,那么HAVING在分组后使用.

  • 如果您使用的是sql语句而不是查询生成器,那么这只是正确的答案.这不应该被标记为@skler给出的解决方案是正确的答案. (8认同)
  • (旧评论,我知道......)。@Tom T:实际上,这个答案是有效的。它是说不要尝试使用 *actual* `DISTINCT` 关键字,而是通过在 QueryBuilder 中使用 `GROUP BY` 来模拟它。然而,他没有举出一个例子。这是一个简单的:`$q = $db->createQueryBuilder(); $q->select('f')->from('t', 't')->groupBy('f');` (2认同)