10

私は Symfony2 プロジェクトに取り組んでおり、KNPPaginatorBundle を使用して簡単なページネーション システムを構築することにしました。そこで、Product エンティティを作成し、ページネーターを indexAction アクション (CRUD コマンドによって生成) に追加したいと考えています。

// Retrieving products.
$em = $this->getDoctrine()->getManager();

//$entities = $em->getRepository('LiveDataShopBundle:Product')->findAll();

$dql   = "SELECT a FROM LiveDataShopBundle:Product a";
$entities = $em->createQuery($dql);

// Creating pagnination
$paginator  = $this->get('knp_paginator');
$pagination = $paginator->paginate(
    $entities,
    $this->get('request')->query->get('page', 1),
    20
);

正常に動作しますが、コントローラーで直接クエリを作成するのではなく、製品のリポジトリを使用したいと考えています。どうやってやるの ?実際、結果のコレクションを paginate オブジェクトに直接追加するのは遅すぎます。これは、すべての製品をロードしてから ArrayCollection をページ分割するためです。

前もって感謝します。

K4

4

3 に答える 3

17

QueryBuilderを使用してProductRepository、それをページネーターに渡すことをお勧めします。

ProductRepository extends EntityRepository
{
    // This will return a QueryBuilder instance
    public function findAll()
    {
        return $this->createQueryBuilder("p");
    }
}

コントローラーで:

$products = $productRepository->findAll();

// Creating pagnination
$paginator  = $this->get('knp_paginator');
$pagination = $paginator->paginate(
    $products,
    $this->get('request')->query->get('page', 1),
    20
);
于 2014-04-02T10:26:49.717 に答える
3

Closure場合によっては、オブジェクトを使用して渡すことができると思いQueryBuilderます。

あなたProductRepositoryは次のようなことができます:

ProductRepository extends EntityRepository
{
    public function findAllPublished(callable $func = null)
    {
        $qb = $this->createQueryBuilder('p');

        $qb->where('p.published = 1');

        if (is_callable($func)) {
            return $func($qb);
        }

        return $qb->getQuery()->getResult();
    }
}

そして次にProductController

public function indexAction(Request $request)
{
    $em = $this->get('doctrine.orm.entity_manager');
    $paginator = $this->get('knp_paginator');

    $func = function (QueryBuilder $qb) use ($paginator, $request) {
        return $paginator->paginate($qb, $request->query->getInt('page', 1), 10);
    };
    $pagination = $em->getRepository('AppBundle:Report')->findAllPublished($func);

    // ...
}

より柔軟で、findAllPublishedメソッドを使用して、必要に応じてページ付けされた結果またはページ付けされていない結果の両方を取得できると思います。

またcallable、PHP では型ヒントが機能することにも注意して>=5.4ください。詳細については、ドキュメントを確認してください。

于 2015-08-06T09:49:04.933 に答える