EC-CUBE3在庫数順(在庫切れ商品後ろ)でエラーの件

EC-CUBE3(EC-CUBE4も同じかもしれませんが)で

・「在庫なし」商品を最後にまとめたいときに在庫数でソートすると良い
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=20257&forum=11

・「在庫なし」商品を表示する、しないボタンを付ける

https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=19843&forum=10&post_id=84975#forumpost84975

 

普通でしたらこれで十分大丈夫なのですが、

在庫数のソートを入れるとエラーになる場合
↓のようにすると

src/Eccube/Repository/ProductRepository.php
getQueryBuilderBySearchData() に

$qb -> orderBy(‘pc.stock’, ‘DESC’);

「システムエラーが発生しました。」

が出てしまう場合の対処方法です。

 

原因はMySQLのバージョン

こちらが参考になります

https://codeday.me/jp/qa/20190312/410615.html

上記リンクが切れた時のために内容を話しますと
「MySQL5.7で
$queryBuilder = $this
->createQueryBuilder(‘recipient’)
->leftJoin(‘recipient.message’, ‘message’)
->orderBy(‘message.dateSent’, ‘DESC’);

したときに
「message.dateSentはSELECTのリストに表示されていないです!」
とエラーになるという事です。

MySQL5.5モジュール版でも起こります。

 

解決方法:SELECTにいれる

src/Eccube/Repository/ProductRepository.php
getQueryBuilderBySearchData()の該当箇所で

$qb->addSelect('pc.stock as HIDDEN stock');
$qb->OrderBy('stock', 'DESC');

としてやると上手くいきます。

 

その前にきちんと
$qb->innerJoin(‘p.ProductClasses’, ‘pc’);

されていることも確認してください。

 

 

 

 

 

 

 

 

 

コメントを残す