Symfony2, используйте QueryBuilder с KnpPaginatorBundle

Я использую KnpPaginatorBundle, и я использую QueryBuilder в репозитории для выбора данных. Я был вынужден поставить параметры Сортировать а также направление в переменных $ сортировать а также $ направление и передать их в запрос, чтобы иметь возможность сделать и Сортировать по.

Этот код работает, но я хотел бы показать его вам и узнать ваше мнение, если это хороший способ сделать это с KnpPaginatorBundle или есть другой лучший способ, предоставляемый knpPaginatorBundle.

Могу ли я передать эти параметры непосредственно knp_paginator, а не в queryBuilder?

Action

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:

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

}

0

Решение

@ phpisuber01 прав, его ответ помогает мне понять. К сожалению, официальный сайт KnpPaginator не приводит пример для QueryBuilder, но упоминает / * запрос НЕ приводит * / in https://github.com/KnpLabs/KnpPaginatorBundle.

Вот пример кода для QueryBuilder:

Первый в репозитории:

/*
* 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();
}

Второй в контроллере:

 /*
* 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));
}

Третий вид:

<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

Другие решения

knp_paginator, сам работает над сортировкой и указанием ключевых слов из URL, их не нужно передавать.
смотри док — https://github.com/KnpLabs/KnpPaginatorBundle

$ listTravels, он вернет все результаты из базы данных — что делать, если у вас слишком много записей.

$pagination = $paginator->paginate()

только получать ограниченные результаты, в зависимости от вашего лимита.

Вы можете напрямую использовать $paginator = $this->get('knp_paginator'); в классе репозитория после прохождения $this->container в качестве аргумента или любого другого метода и может использовать

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

По вопросам рекламы [email protected]