0

そこで、dojox.grid.DataGrid のストアとして使用するdojo.store.jsonRestのページングを実装しました。サーバーでSymfony 2を使用し、ORM Doctrineとして、この 2 つのフレームワークは初めてです。

Dojo jsonRest の場合、サーバーの応答には、結果のオフセット制限、およびレコードの総数 (制限なし)を含むヘッダーContent-Rangeが含まれている必要があります。

したがって、Content-Range: items 0-24/66ヘッダーを含む応答の場合、ユーザーがグリッド レコードを24 行までスクロールする場合、 Range: 24-66ヘッダーを使用して非同期要求を作成し、次に応答ヘッダーを使用します。 Content-Range: items 24-66/66が必要です。これは、Dojo が、ページ分割されたデータに対して作成できる要求の数と、提示された要求と後続の要求のレコード範囲を知ることができるようにするために行われます。

したがって、私の問題は、制限なしでレコードの総数を取得するには、オフセットと制限を持つ同じクエリを使用してCOUNTクエリを作成する必要があったことです。私はこれが好きではありません。

2 つのクエリを実行せずに合計数と限定された結果を取得できる方法があるかどうかを知りたいです。

public function getByTextCount($text)
{
    $dql = "SELECT COUNT(s.id) FROM Bundle:Something s WHERE s.text LIKE :text";

    $query = $this->getEntityManager()->createQuery($dql);
    $query->setParameter('text', '%'.$text.'%');

    return $query->getSingleScalarResult();
}

-

public function getByText($text, $offset=0, $limit=24)
{
    $dql = "SELECT r FROM Bundle:Something s WHERE s.text LIKE :text";

    $query = $this->getEntityManager()->createQuery($dql);
    $query->setParameter('text', '%'.$text.'%');
    $query->setFirstResult($offset);
    $query->setMaxResults($limit);

    return $query->getArrayResult();
}
4

2 に答える 2

1

MySQL を使用している場合は、SELECT FOUND_ROWS().

ドキュメントから。

SELECT ステートメントには、サーバーがクライアントに返す行数を制限する LIMIT 句を含めることができます。場合によっては、ステートメントを再実行せずに、LIMIT なしでステートメントが返す行数を知ることが望ましい場合があります。この行数を取得するには、SELECT ステートメントに SQL_CALC_FOUND_ROWS オプションを含め、後で FOUND_ROWS() を呼び出します。

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
于 2012-04-21T04:24:41.437 に答える
0

Doctrine のみを使用する場合 (つまり、ベンダー固有の SQL を避けるため)、エンティティを選択した後、いつでもクエリの一部をリセットできます。

    // $qb is a Doctrine Query Builder
    // $query is the actual DQL query returned from $qb->getQuery()
    // and then updated with the ->setFirstResult(OFFSET) and ->setMaxResults(LIMIT)

    // Get the entities as an array ready for JSON serialization
    $entities = $query->getArrayResult();

    // Reset the query and get the total records ready for the Range header
    // 'e' in count(e) is the alias for the entity specified in the Query Builder
    $count = $qb->resetDQLPart('orderBy')
                ->select('COUNT(e)')
                ->getQuery()
                ->getSingleScalarResult();
于 2012-05-14T16:38:43.867 に答える