2016-06-16 18 views
1

結果とともに合計数を返すことは可能ですか? 現在、このDQLクエリを使用して配列結果を取得していますが、結果ごとに合計カウントを返す必要もあります。doctrine paginatorでの結果の返り値

$dql = "SELECT a, a.id, a.status, a.departDate, a.flightNum, a.departHour, a.arrivedHour, a.convocHour, a.convocPlace, a.customerPax, a.customerNote, a.providerPax,a.providerNote 
    FROM AppBundle:Assistance a GROUP BY a.id"; 
    $query = $this->getEntityManager()->createQuery($dql) 
     ->setFirstResult($skip) 
     ->setMaxResults($take); 
    $paginator = new Paginator($query, $fetchJoinCollection = true); 

    $c = count($paginator); 

    dump($paginator->getIterator()->getArrayCopy()); 

    return $paginator->getIterator()->getArrayCopy(); 
+0

返信に返信していますか?あなたは、ページ数、最後のページなどのような他のメタデータを持つオブジェクトのページ番号付きの結果をラップすることができます。 – mickadoo

+0

functionから1つのオブジェクトだけを返すことができます。複雑なオブジェクト(構造体)のデータを@mickadooまたは店舗数をグローバルに管理できます。 – comrade

+0

https://github.com/KnpLabs/KnpPaginatorBundleへ移動 –

答えて

1

私は考えていないが可能であり、一度に結果と合計数を取得するには、基本的にはボンネットの下に、教義は、2つのクエリを実行します。

アイテムを取得する

まず1:countに

SELECT * FROM tbl 
// and optional clausules 
WHERE tbl.active = 1 
GROUP BY tbl.type 
ORDER BY tbl.rank 
// taking one page 
LIMIT 10 
OFFSET 20 

秒1:

SELECT COUNT(*) FROM tbl 
// and optional clousules 
WHERE tbl.active = 1 
GROUP BY tbl.type 

symfony2プロファイラで確認できます。

だから、あなたが選択するには、いくつかのオプションがあります。

配列を返すか、ラッパーオブジェクトのいくつかの種類

return array("count" => count($paginator), "items" => $paginator->getIterator()->getArrayCopy()); 

またはあなたが本当に

$count = count($paginator); 
$items = $paginator->getIterator()->getArrayCopy(); 
foreach($items as $item) { 
    $item->setCount($count); 
} 

ことが必要な場合は、各項目のために手動で設定しますなぜ$ paginatorオブジェクトを返さないのですか?

+0

こんにちは、これは私が結局どのように配列を返すかです。また、実際には必要ではなかったので、改ページを削除しました。これを使って、データグリッドの総数を求めていました。再計算のカウント関数 $ qb = $ this-> createQueryBuilder( 't'); $ qb-> select( 'count(t.id)'); \t .. return $ qb - > getQuery() - > getSingleScalarResult(); とコントローラ内 $ count = $ repository-> count(..); $ asReturn = [ 'assistances' => $アシスタンス、 'totalCount' => $ count ]; return $ asReturn; –

0

ます。またKnpPaginatorBundle使用することができます。

public function getItemsAction(Request $request) 
{ 
    $itemsQuery = $this->repository->getItems(); 

    $current = $request->get('page', 1); 
    $limit = $request->get('limit', 10); 

    $pagination = $this->paginator->paginate($itemsQuery, $current, $limit); 

    $pagerResult = [ 
     'count' => $pagination->getTotalItemCount(), 
     'items' => $pagination->getItems(), 
     'limit' => $pagination->getItemNumberPerPage(), 
     'current' => $pagination->getCurrentPageNumber() 
    ]; 

    return new JsonResponse($pagerResult); 
} 
関連する問題