短い答え、いいえ。基本的にこのクエリを実行しています:
SELECT * FROM transaction WHERE user = $userId AND device = "$device" LIMIT $currentPage, $transactionPerPage;
制限を指定することにより、クエリはその制限内のオフセットからの行数のみを返します。したがって、 の場合$transactionPerPage = 10
、そのクエリによって返される行の合計は になります10
。
合計数がある程度静的であると仮定すると、最初のページ要求で一致するドキュメントの合計数を最初に実行し、その結果をキャッシュする (またはセッションに保存する) ことをお勧めします。そのため、合計数を取得する必要があるのは 1 回だけです。
編集:通常の php セッションのみを使用したカウント クエリの例:
if ( !isset( $_SESSION['transactionCount'] ) )
{
$transactionCount = $em->createQuery('SELECT COUNT(*) FROM \Icarus\Entity\ServicePlan\Transaction WHERE user = ?1 AND device = ?2')
->setParameters( array( 1 => $userId, 2 => $device ) )
->getSingleScalarResult();
$_SESSION['transactionCount'] = $transactionCount;
}
edit2:本当に DQL を使用したくない場合は.findBy()
、オフセットと制限なしで実行し、結果に対して sizeof を実行できます。
$transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $device) );
$totalTransactions = sizeof( $transactions );
ただし、実際にはすべてのオブジェクトをフェッチしているため、パフォーマンスはそれほど良くありません。