DoctrineのQueryBuilder(クエリビルダ)でhavingを使った絞り込みを行う時、下記のエラーが発生することがあります。

Cannot count query that uses a HAVING clause. Use the output walkers for pagination

Cannot count query that uses a HAVING clause. Use the output walkers for pagination

ページネーションを行なっているフロント側の商品一覧ページでHavingやaddHavingを使うと上記のエラーが発生することがあります。
とはいえ、商品価格や販売個数などのAVERAGEやSUM、MIN、MAXで商品を絞り込みしたい場合もありますよね。

その時は、ページネーションの生成箇所でwrap_queryを使ってやるとエラーがなく実行できるようになります。
商品一覧ページのProductControllerであれば、元々のコードは下記のようになっています。

Eccube\Controller\ProductController::indexメソッド内のページネーションを生成している箇所

$pagination = $app['paginator']()->paginate(
    $qb,
    !empty($searchData['pageno']) ? $searchData['pageno'] : 1,
    $searchData['disp_number']->getId()
);

下のように書き直します。

$pagination = $app['paginator']()->paginate(
    $qb,
    !empty($searchData['pageno']) ? $searchData['pageno'] : 1,
    $searchData['disp_number']->getId(),
    array('wrap-queries' => true)
);

これで正常にページネーションが動作するようになります。4系では少し書き方が違いますが、wrap_queryを使用するのは同じです。

日本発!ECオープンプラットフォーム「EC-CUBE」 EC-CUBEゴールドパートナー EC-CUBEは株式会社イーシーキューブの商標です

EC-CUBEに関するお問い合わせ


    [重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。

    EC-CUBEバージョンアップ