首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2,使用QueryBuilder和KnpPaginatorBundle

Symfony2,使用QueryBuilder和KnpPaginatorBundle
EN

Stack Overflow用户
提问于 2014-11-26 19:09:12
回答 2查看 2K关注 0票数 0

我使用KnpPaginatorBundle,在存储库中使用QueryBuilder来选择数据。我必须将参数、排序、方向放在变量、$sort、$direction中,并将它们传递到查询中,以便能够通过来执行do和命令。

这段代码可以工作,但我想向您展示并了解您的意见,如果这是使用knpPaginatorBundle的好方法,还是KnpPaginatorBundle提供的另一种更好的方法。

我可以直接把这些参数传递给knp_paginator而不是queryBuilder吗?

Action

代码语言:javascript
复制
public function listAction($page, Request $request)
{
    $em = $this->getDoctrine()->getManager();

    $paginator  = $this->get('knp_paginator');


    if($request->query->get('sort') and $request->query->get('direction')) {
        $sort = $request->query->get('sort') ;
        $direction = $request->query->get('direction');
    }
    else{
        $sort = 'id'; // set default sort
        $direction = 'asc';  // set default direction
    }   

    // pass those two variables to query
    $listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend($sort, $direction);

    $pagination = $paginator->paginate(
        $listTravels,
        $this->get('request')->query->get('page', $page)/*page number*/,
        10/*limit per page*/
    );

    return $this->render('ProjectFrontendBundle:Frontend:list.html.twig',array(
        'pagination' => $pagination
    ));
}

TravelRepository:

代码语言:javascript
复制
public function getListTravelsFrontend($sort, $direction) // parameters $sort, $direction
{

    $qb = $this->createQueryBuilder('t')
        ->leftJoin('t.image', 'i')
        ->addSelect('i')
        ->leftJoin('t.agence', 'a')
        ->addSelect('a')
        ->Where('t.enabled = 1')
        ->orderBy('t.'.$sort, $direction); // orderBy with those parameters

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

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-20 16:22:23

@phpiuber01是对的,他的回答帮助我理解。不幸的是,官方的KnpPaginator站点没有给出QueryBuilder的示例,而是在https://github.com/KnpLabs/KnpPaginatorBundle中提到了/*查询而不是结果*/。

下面是QueryBuilder的示例代码:

第一次在储藏室:

代码语言:javascript
复制
/*
 * GiftDataRepository.php (in Repository/... directory)
 * return all records in table GiftData.
 */
public function getLatestRecords()
{
    $qb = $this->createQueryBuilder('q')->select('q');
    // getQuery() returns query NOT result.
    return $qb->getQuery();
}

财务主任第二名:

代码语言:javascript
复制
 /*
  * TabulaRepository.php (in Controller/... directory)
  * return pagination object within template.
  */
 public function giftsDataShowAction(Request $request, $format)
{
    $em             = $this->getDoctrine()->getManager();
    $giftsdataquery = $em->getRepository('AppBundle:GiftData')->getLatestRecords();

    $paginator = $this->get('knp_paginator');
    /* page number 1, limit per page 5 */
    $pagination = $paginator->paginate($giftsdataquery, $request->query->getInt('page', 1), 5);

    // parameters to template
    return $this->render('data/data_gifts.html.twig', array('pagination' => $pagination));
}

第三种观点:

代码语言:javascript
复制
<div class="count">Total of: {{ pagination.getTotalItemCount }}</div>
<table class="table table-responsive table-striped">
    <thead>
    <tr>
        {# sorting of properties based on query components #}
        <th class="hidden-xs">{{ knp_pagination_sortable(pagination, 'Id', 'q.id') }}</th>
        <th {% if pagination.isSorted('q.circumstances') %} class="sorted"{% endif %}>{{ knp_pagination_sortable(pagination, 'Circumstances', 'q.circumstances') }}</th>
        <th class="hidden-xs">{{ knp_pagination_sortable(pagination, 'Date Of Report', 'q.dateOfReport') }}</th>
    </tr>
    </thead>
    <tbody>

    {% for row in pagination %}
        <tr {% if loop.index is odd %}class="color"{% endif %}>
            <td id="col" class="hidden-xs">{{ row.id }}</td>
            <td id="col">{{ row.circumstances }}</td>
            <td id="col" class="hidden-xs">{{ row.dateOfReport }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>

就是这样。

票数 1
EN

Stack Overflow用户

发布于 2015-03-27 13:24:16

knp_paginator本身处理url中的排序和方向关键字,您不必传递它们。见doc - https://github.com/KnpLabs/KnpPaginatorBundle

$listTravels,它将返回来自数据库的所有结果--如果您有太多的记录怎么办。

代码语言:javascript
复制
$pagination = $paginator->paginate()  

根据您的限制,只获取有限的结果。

在传递$paginator = $this->get('knp_paginator');作为参数或任何其他方法之后,可以在存储库类中直接使用$this->container,并且可以使用

代码语言:javascript
复制
$paginator  = $this->container->get('knp_paginator');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27157064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档