Symfony2,如何使用 KnpPaginatorBundle 和 QueryBuilder 传递参数排序和方向

Posted

技术标签:

【中文标题】Symfony2,如何使用 KnpPaginatorBundle 和 QueryBuilder 传递参数排序和方向【英文标题】:Symfony2, How can I pass parameters sort and direction using KnpPaginatorBundle and QueryBuilder 【发布时间】:2014-11-28 17:06:37 【问题描述】:

我正在使用 KnpPaginatorBundle,我正在使用 Repository 中的 QueryBuilder 来选择数据。我想知道如何在查询中传递Form发送的参数sortdirection

这是形式:

<form action="" method="get" class="form_sort" id="myForm">
                        <span class="manage_title">Sort by:</span>
                            <select class="select_styled white_select" id="sort_list" name="option">
                                <option value="">-------</option>
         knp_pagination_sortable(pagination, 'Country A-Z', 'country', 'sort': 'country', 'direction': 'asc') 
         knp_pagination_sortable(pagination, 'Country Z-A', 'country', 'sort': 'country', 'direction': 'desc') 
         knp_pagination_sortable(pagination, 'City A-Z', 'destination', 'sort': 'destination', 'direction': 'asc') 
         knp_pagination_sortable(pagination, 'City Z-A', 'destination', 'sort': 'destination', 'direction': 'desc') 
                            </select>
</form>

动作控制器:

public function listAction($page, Request $request)

$em = $this->getDoctrine()->getManager();

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


$listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontend();

$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
));

TravelReopsitory:

public function getListTravelsFrontend()


$qb = $this->createQueryBuilder('t')
    ->leftJoin('t.image', 'i')
    ->addSelect('i')
    ->leftJoin('t.agence', 'a')
    ->addSelect('a')
    ->Where('t.enabled = 1');

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


【问题讨论】:

方向是什么意思? 方向升序或降序 【参考方案1】:

排序是在数据库层上处理的(使用 mysql ORDER BY),因此您不能从 getResult() 传递数据数组。您必须将 QueryBuilder 实例作为目标传递给您的 paginate() 调用。 KnpPaginator 具有特殊的 Listener 和 Walker,可以根据请求使用正确的 ORDER BY 修改您的查询,然后为您执行分页。

TravelReopsitory:

public function getListTravelsFrontendQueryBuilder()

   $qb = $this->createQueryBuilder('t')
       ->leftJoin('t.image', 'i')
       ->addSelect('i')
       ->leftJoin('t.agence', 'a')
       ->addSelect('a')
       ->Where('t.enabled = 1');

return $qb;

动作控制器:

public function listAction($page, Request $request)

$em = $this->getDoctrine()->getManager();

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

$qb = $em->getRepository('ProjectTravelBundle:Travel')->getListTravelsFrontendQueryBuilder();

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

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

【讨论】:

是否可以获得像这样/travels?sort=country&amp;direction=asc而不像这样/travels?sort=t.country&amp;direction=asc这样的没有别名(t.country)的url? @hous 我不认为这是开箱即用的。 @hous 此功能已在此处请求:github.com/KnpLabs/KnpPaginatorBundle/issues/196

以上是关于Symfony2,如何使用 KnpPaginatorBundle 和 QueryBuilder 传递参数排序和方向的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 symfony2“手动”处理文件上传?

如何使用 Symfony2 路由组件将路由与控制器绑定

如何在 symfony2 中使用子文档映射 mongo 文档

如何强制用户注销 symfony2

symfony2 / 学说:如何将 ResultSetMapping 与计数一起使用

如何在 symfony2 中创建 slugify?