あなたの場合、サブクエリを実行するのは pagerfanta ではありません。これは、元のクエリ ビルダー インスタンスのソースです。
通常、エンティティ リポジトリには、結果の代わりにプレーンなクエリ ビルダー インスタンスを返す関数があります。効率的なクエリ ビルダを作成するのはあなたに任されています。次に、そのクエリ ビルダーを DoctrineORMAdapter にフィードします。
プロジェクト全体で使用するこのヘルパー関数があります。
/**
* Pass an array, entity or a custom QueryBuilder instance to paginate.
* Takes an array of parameters as a second argument.
* Default parameter values:
*
* $params = array(
* 'curPage' => 1,
* 'perPage' => 15,
* 'order' => 'DESC'
* );
*
* @param mixed $object
* @param array $params
*
* @return Pagerfanta
*/
public function paginate($object, $params = array())
{
if (is_array($object)) {
$adapter = new ArrayAdapter($object);
} elseif ($this->isEntity($object)) {
$qb = $this->em->createQueryBuilder()
->select('s')
->from($this->getEntityName($object), 's')
->orderBy('s.id', isset($params['order']) ? $params['order'] : 'DESC');
$adapter = new DoctrineORMAdapter($qb);
} elseif ($object instanceof QueryBuilder) {
$adapter = new DoctrineORMAdapter($object);
}
$pager = new Pagerfanta($adapter);
$pager->setMaxPerPage(isset($params['perPage']) ? $params['perPage'] : 15);
$pager->setCurrentPage(isset($params['curPage']) ? $params['curPage'] : 1);
return $pager;
}
配列、エンティティ、またはクエリ ビルダー インスタンスを渡すと、適切にページ分割された、すぐに使用できるオブジェクトが返されます。
あなたはおそらくそれがどのように行われたか知っているでしょうが、とにかく、これが私のエンティティリポジトリにあるものです.1つの関数はクエリビルダインスタンスを返し(pagerfantaに最適)、もう1つの関数は他の場所で使用される配列を返します:
public function getMessageQueryBuilder($campaignId, $eqCriteriaArray = array(), $neqCriteriaArray = array())
{
$qb = $this->createQueryBuilder('m');
$qb->select('m')
->leftJoin('m.campaign', 'c')
->leftJoin('m.sentBy', 'u')
->where($qb->expr()->eq('m.campaign', $campaignId));
foreach ($eqCriteriaArray as $property => $value) {
$qb->andWhere($qb->expr()->eq($property, $qb->expr()->literal($value)));
}
foreach ($neqCriteriaArray as $property => $value) {
$qb->andWhere($qb->expr()->neq($property, $qb->expr()->literal($value)));
}
return $qb->orderBy('m.id', 'DESC');
}
public function filterMessages($campaignId, $eqCriteriaArray = array(), $neqCriteriaArray = array())
{
return $this->getMessageQueryBuilder($campaignId, $eqCriteriaArray, $neqCriteriaArray)->getQuery()->getResult();
次に、これら 2 つを組み合わせて実際のページャー オブジェクトを取得します。
$singleSmsPager = $this->pagerUtil->paginate(
$this->em->getRepository('TreasureForgeMessageBundle:Message')
->getMessageQueryBuilder(CcToolSender::CAMPAIGN_ID, array(), array('u.username' => 'admin')),
array(
'curPage' => $singleSmsPage,
'perPage' => 10
)
);