Doctrine orm 条令-如何在使用查询生成器时添加集合
在使用条令和查询生成器时,一个重要的任务是为结果集添加水分。我的问题是如何返回数组及其子集: 这是针对单个结果集的,答案非常简单:Doctrine orm 条令-如何在使用查询生成器时添加集合,doctrine-orm,doctrine-odm,laminas-api-tools,Doctrine Orm,Doctrine Odm,Laminas Api Tools,在使用条令和查询生成器时,一个重要的任务是为结果集添加水分。我的问题是如何返回数组及其子集: 这是针对单个结果集的,答案非常简单: $qb = $this->stoneRepository->createQueryBuilder('S'); $query = $qb->addSelect('A','P','I','C') ->leftJoin('S.attribute', 'A') ->lef
$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类只是扩展了paginator:
<?php
namespace Api\V1\Rest\Stone;
use Zend\Paginator\Paginator;
class StoneCollection extends Paginator
{
}
我的答案如上所述: 我有这个工作,虽然我不喜欢它,因为我打了两次数据库。第一次构建数组(这是整个结果集,对于某些应用程序来说可能非常大),然后第二次分页结果,然后返回给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;
}
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;
}
在分页的条令文档中,他们声明使用$fetchJoinCollection=true,我相信这与您尝试使用的代码相同。 在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;
}