Helpex - Trao đổi & giúp đỡ Đăng nhập
6

Tôi đang cố gắng lấy các bộ sưu tập không rỗng, tức là có ít nhất 1 đối tượng. Thực thể bộ sưu tập có mối quan hệ OneToMany với thực thể Đối tượng. Tôi đang sử dụng phân trang KNP để phân trang kết quả. Đây là chức năng của tôi:

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

Lỗi

Tôi tiếp tục nhận được lỗi sau

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

Không có mệnh đề 'Có' mọi thứ hoạt động tốt, nhưng tôi phải nhận được các bộ sưu tập không rỗng.

6 hữu ích 0 bình luận 3.9k xem chia sẻ
13

quấn-truy vấn đã giải quyết vấn đề này

 $collections = $this->get("knp_paginator")->paginate($collections, $page, $limit,array('wrap-queries'=>true));
13 hữu ích 2 bình luận chia sẻ
2

Bạn có thể triển khai đếm Thủ công, như được mô tả ở đây trong tài liệu .

Ví dụ: bạn có thể sửa đổi mã của mình như sau:

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

Hy vọng điều này giúp đỡ

2 hữu ích 1 bình luận chia sẻ
1

Giải pháp của tôi dựa trên giải pháp của @ Matteo, vì truy vấn của tôi hơi phức tạp nên tôi cũng muốn chia sẻ phiên bản của mình:

$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 Doctrine\ORM\Tools\Pagination\Paginator::getCountQuery()
     */
    $platform = $this->getEntityManager()->getConnection()->getDatabasePlatform();
    $rsm = new Query\ResultSetMapping();
    $rsm->addScalarResult($platform->getSQLResultCasing('dctrn_count'), 'count');
    $countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountOutputWalker::class);
    $countQuery->setResultSetMapping($rsm);

    return $countQuery->getSingleScalarResult(); //returns integer
1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ mysql symfony doctrine-orm knppaginator , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading