3

我之前问的一个问题是在使用 Doctrine 和查询构建器时对结果集进行水合处理。我的问题是如何返回一个数组及其子集:

这是针对单个结果集的,答案很简单:

    $qb = $this->stoneRepository->createQueryBuilder('S');

        $query = $qb->addSelect('A','P','I','C')
            ->leftJoin('S.attribute', 'A')
            ->leftJoin('A.category', 'C')
            ->innerJoin('S.product' , 'P')
            ->innerJoin('S.image' , 'I')
            ->where('S.id = :sid')
            ->setParameter('sid', (int) $stone_id)
            ->getQuery();

        $resultArray = $query->getOneOrNullResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);

        return $resultArray;

我的下一个问题是如何为一个集合做同样的事情?这是我尝试过的:

public function fetchAll()
    {
        $qb   = $this->stoneRepository->createQueryBuilder('S');

        $qb->addSelect('A','P','I','C')
            ->leftJoin('S.attribute', 'A')
            ->leftJoin('A.category', 'C')
            ->innerJoin('S.product' , 'P')
            ->innerJoin('S.image' , 'I')
            ->where('S.state=:state')
            ->setParameter('state' , 1 );

        $adapter    = new DoctrineAdapter( new ORMPaginator( $qb ) );
        $collection = new StoneCollection($adapter);

        return $collection;
    }

这个解决方案我面临的问题是连接表没有被填充,我最终得到了一个空结果的集合。

StoneCollection 类只是扩展了分页器:

<?php
namespace Api\V1\Rest\Stone;

use Zend\Paginator\Paginator;

class StoneCollection extends Paginator
{

}

我在想也许最好的方法是获取一个数组并对数组进行分页?

编辑::

我有这个工作,虽然我并不热衷于它,因为我两次访问数据库。第一次构建数组(这是整个结果集,对于某些应用程序来说可能非常大),然后第二次对结果进行分页,然后将结果返回到 ApiGility 中的 HAL 进行处理......

理想情况下,这应该一次性完成,但是我不确定如何在单个实例中补充结果......

public function fetchAll( $page = 1 )
{
    $qb   = $this->stoneRepository->createQueryBuilder('S');

    $qb->addSelect('A','P','I','C')
        ->leftJoin('S.attribute', 'A')
        ->leftJoin('A.category', 'C')
        ->innerJoin('S.product' , 'P')
        ->innerJoin('S.image' , 'I')
        ->where('S.state=:state')
        ->setParameter('state' , 1 );

    $resultArray = $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);

    $paginator = new \Zend\Paginator\Paginator(new \Zend\Paginator\Adapter\ArrayAdapter($resultArray));
    $paginator->setCurrentPageNumber($page);

    return $paginator;
}
4

2 回答 2

2

答案就像我上面所说的:

我有这个工作,虽然我并不热衷于它,因为我两次访问数据库。第一次构建数组(这是整个结果集,对于某些应用程序来说可能非常大),然后第二次对结果进行分页,然后将结果返回到 ApiGility 中的 HAL 进行处理......

理想情况下,这应该一次性完成,但是我不确定如何在单个实例中补充结果......

public function fetchAll( $page = 1 )
{
    $qb   = $this->stoneRepository->createQueryBuilder('S');

    $qb->addSelect('A','P','I','C')
        ->leftJoin('S.attribute', 'A')
        ->leftJoin('A.category', 'C')
        ->innerJoin('S.product' , 'P')
        ->innerJoin('S.image' , 'I')
        ->where('S.state=:state')
        ->setParameter('state' , 1 );

    $resultArray = $qb->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);

    $paginator = new \Zend\Paginator\Paginator(new \Zend\Paginator\Adapter\ArrayAdapter($resultArray));
    $paginator->setCurrentPageNumber($page);

    return $paginator;
}
于 2015-03-29T16:20:41.503 回答
0

在 Pagination 的 Doctrine 文档中,他们声明使用 $fetchJoinCollection = true,我相信这与您尝试使用的 HYDRATE 相同。 教义分页

在我的 QueryBuilder 的分页代码中,我使用它,如下所示:

public function getAllPaginated($page, $limit){
    $query = $this->createQueryBuilder('o')
                ->select('o')
                ->getQuery();

    $paginator = new Paginator($query, $fetchJoinCollection = true);
    $paginator->getQuery()
        ->setFirstResult($limit * ($page - 1)) // Offset
        ->setMaxResults($limit);

    return $paginator;
}
于 2018-04-25T21:32:16.470 回答