Symfony2原则错误:无法计数使用HAVING子句的查询.使用输出步行器进行分页



我正在尝试获取非空的集合,即至少有一个对象。集合实体与对象实体具有OneToMany关系。我正在使用KNP分页器对结果进行分页。这是我的功能:

  public function fetchAction(Request $request){
    $em = $this->getDoctrine()->getManager();
    $page = $request->get('page', 1);
    $limit = 10;
    $collections = $em->createQueryBuilder()
        ->select('c')
        ->add('from', 'CollectionBundle:Collection c LEFT JOIN c.object o')
        ->having('COUNT(o.id)>0')
        ->orderBy('c.date', 'DESC')
        ->getQuery();
    $collections = $this->get("knp_paginator")->paginate($collections, $page, $limit);
    return $this->render('CollectionBundle:Collection:fetch.html.twig', [
        'collections' => $collections
    ]);
}

错误

我不断收到以下错误

 Cannot count query that uses a HAVING clause. Use the output walkers for pagination

如果没有"Having"子句,一切都很好,但我必须获得非空集合。

包装查询解决了这个问题

 $collections = $this->get("knp_paginator")->paginate($collections, $page, $limit,array('wrap-queries'=>true));

您可以实现手动计数,如文档中所述。

例如,您可以如下修改代码:

$count = $em->createQueryBuilder()
        ->select('COUNT(c)')
        ->add('from', 'CollectionBundle:Collection c LEFT JOIN c.object o')
        ->having('COUNT(o.id)>0')
        ->orderBy('c.date', 'DESC')
        getSingleScalarResult();

    $collections = $em->createQueryBuilder()
        ->select('c')
        ->add('from', 'CollectionBundle:Collection c LEFT JOIN c.object o')
        ->having('COUNT(o.id)>0')
        ->orderBy('c.date', 'DESC')
        ->getQuery();
    $collections->setHint('knp_paginator.count', $count); 
    $collections = $this->get("knp_paginator")->paginate($collections, $page, $limit,array('distinct' => false));
    return $this->render('CollectionBundle:Collection:fetch.html.twig', [
        'collections' => $collections
    ]);

希望这能帮助

我的解决方案基于@Matteo的解决方案,因为我的查询有点复杂,所以我也想分享我的版本:

$qb = $this->createQueryBuilder('c');
    $qb->select('count(c.id)')
        ->addSelect('COUNT(DISTINCT m.id) AS HIDDEN messageCount')
        ->addSelect('COUNT(DISTINCT f.id) AS HIDDEN fileCount')
        ->join('c.user', 'u')
        ->join('c.status', 's')
        ->join('c.company', 'comp')
        ->leftJoin('c.files', 'f')
        ->leftJoin('c.messages', 'm');
    $this->_set_filters($filter, $qb);
    $qb->groupBy('c.id');
    $countQuery = $qb->getQuery();
    /** wrap query with SELECT COUNT(*) FROM ($sql)
    * I don't know what exactly does this block but
    * I coppied it from DoctrineORMToolsPaginationPaginator::getCountQuery()
     */
    $platform = $this->getEntityManager()->getConnection()->getDatabasePlatform();
    $rsm = new QueryResultSetMapping();
    $rsm->addScalarResult($platform->getSQLResultCasing('dctrn_count'), 'count');
    $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountOutputWalker::class);
    $countQuery->setResultSetMapping($rsm);
    return $countQuery->getSingleScalarResult(); //returns integer

相关内容

  • 没有找到相关文章

最新更新