【问题标题】:How to use countDistinct in Doctrine query builder (Symfony)如何在 Doctrine 查询生成器 (Symfony) 中使用 countDistinct
【发布时间】:2014-08-05 11:55:47
【问题描述】:

我正在尝试使用他的查询计算返回的不同 ID 数量:

$query = $repo->createQueryBuilder('prov')
        ->select('c.id')
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->countDistinct('c.id')
        ->getQuery();

我收到了这个错误:

Attempted to call method "countDistinct" on class "Doctrine\ORM\QueryBuilder" [...]

我也试过

$query = $repo->createQueryBuilder('prov')
        ->select('c.id')
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->expr()->countDistinct('c.id')
        ->getQuery();

导致此错误:

Error: Call to a member function getQuery() on a non-object in

对于如何以不同于documentation 的方式执行此操作,我无法获得任何其他指示

【问题讨论】:

    标签: php symfony doctrine-orm query-builder


    【解决方案1】:

    countDistinct 是 Expr 类的方法,并且 COUNT DISTINCT 需要在 SELECT 语句中,所以:

    $qb = $repo->createQueryBuilder('prov');
    $query = $qb
            ->select($qb->expr()->countDistinct('c.id'))
            ->innerJoin('prov.products', 'prod')
            ->innerJoin('prod.customerItems', 'ci')
            ->innerJoin('ci.customer', 'c')
            ->where('prov.id = :brand')
            ->setParameter('brand', $brand)
            ->getQuery();
    

    应该可以。 或者简单地说:

    $query = $repo->createQueryBuilder('prov')
            ->select('COUNT(DISTINCT c.id)')
            ->innerJoin('prov.products', 'prod')
            ->innerJoin('prod.customerItems', 'ci')
            ->innerJoin('ci.customer', 'c')
            ->where('prov.id = :brand')
            ->setParameter('brand', $brand)
            ->getQuery();
    

    【讨论】:

    • 谢谢,但是当 DISTINCT 与 SUM 一起使用时,为什么 DISTINCT 可以作为函数工作,但与 COUNT 不一样?有什么信息吗?
    • 很好,适合我!
    【解决方案2】:

    在您的情况下使用 countDistinct 的正确方法是:

    $qb = $repo->createQueryBuilder('prov');
    
    $query = $qb->
        ->select($qb->expr()->countDistinct('c.id'))
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->getQuery();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2013-03-11
      • 2017-01-13
      • 1970-01-01
      • 2020-11-24
      相关资源
      最近更新 更多