私が尋ねた以前の質問は、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
{
}
おそらく最良の方法は、配列を取得して配列をページングすることだと思いますか?
編集::
DBに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;
}