DoctrineのQueryBuilder(クエリビルダ)でhavingを使った絞り込みを行う時、下記のエラーが発生することがあります。
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-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。