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
{

}

おそらく最良の方法は、配列を取得して配列をページングすることだと思いますか?

編集::

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;
}
4

2 に答える 2

2

これに対する答えは、上記のとおりです。

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;
}
于 2015-03-29T16:20:41.503 に答える