1

カスタム DQL を記述せずに Doctrine2 でページネーションを行う方法があるかどうかを確認しようとしています。関数が必要な結果セットを返すことがわかりましたがfindBy()、UI で適切に改ページするための情報が 1 つ不足しています。つまり、結果が返す可能性のあるレコードの総数です。

「シンプルな」ワンライナーなので、これが可能になることを本当に望んでいます。

    $transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $device), null, $transactionsPerPage, $currentPage);

findBy()関数からこの情報を取得する方法/方法を知っている人はいますか?

4

2 に答える 2

1

短い答え、いいえ。基本的にこのクエリを実行しています:

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

ただし、実際にはすべてのオブジェクトをフェッチしているため、パフォーマンスはそれほど良くありません。

于 2012-10-18T00:26:09.003 に答える
-1

これを試しましたか?

$queryBuilder->select('p.id, p.name')
                 ->from('\Api\Project\Entity\Project', 'p')
                 ->where('p.status = :status')
                 ->setParameter('status', 1)
                 ->orderBy('p.createdDate', 'asc')
                 ->setFirstResult($page)
                 ->setMaxResults($limit);
于 2013-01-31T06:06:40.130 に答える