1

クエリで制限とオフセットを使用したいのですが、返されるレコードの数が一致しません。オフセットと制限機能を使用していない場合、26 個のオブジェクトを取得し、メソッドを設定した後

->setMaxResults(5)
->setFirstResult(10)

番号は 1 です ... 何が起こっているのですか?

4

1 に答える 1

7

あなたはおそらく、DQL でフェッチ結合するときに発生する典型的な問題です。これは非常に単純な問題であり、まだハイドレートされておらず、正規化する必要がある結果セットにオフセットと制限が適用されるという事実に由来します (最初の結果と最大結果に関するドキュメントを参照してください)。

この問題を回避したい場合 (より複雑な結合またはフェッチ結合された結果であっても)、ORM DQL Paginator APIを使用する必要があります。ページネーターを使用すると、基本的に複数のクエリがトリガーされ、次のことが行われます。

  1. オフセット/制限に従って、結果セット内のレコード数を計算します
  2. クエリのルート エンティティのさまざまな識別子を計算します (適用された最大/最初の結果を使用)
  3. 結合された結果を取得します (最初/最大の結果を適用せずに)

その使用法は非常に簡単です。

$query = $em->crateQuery($fetchJoinQuery);

$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);

$query->setFirstResult(20);
$query->setMaxResults(100);

foreach ($paginator as $result) {
    var_dump($result->getId());
}

これにより、結合またはフェッチ結合された結果の数に関係なく、オフセット 20 のアイテムから始まる 100 アイテムが出力されます。

これはパフォーマンスが悪いように見えるかもしれませんが、フェッチ結合結果の問題を処理する最も安全な方法であり、明らかにスクランブルされたオフセットと結果の制限を引き起こします。ORM Paginatorの内部に飛び込むことで、これがどのように処理されるかを直接調べることができます。

于 2013-02-25T22:30:44.757 に答える