EC-CUBEでNULL(未入力)が最後になるようソートするのって、少し難しいですよね?
MySQLではNULLは最小の値として扱われるという仕様があり、通常rankをASCで並び替えるとNULL→1→2というようにソートされます。
一方、PostgreSQLの場合は「NULL LAST」がデフォルトですので、rankをASCで並び替えると1→2→NULLという順番でソートされます。
MySQLで昇順かつ、NULLを最後に持ってきたい時のクエリビルダはCASE文を用いて次のようになります。
$qb ->addSelect('(case when p.rank IS NULL then 1 else 0 end) as HIDDEN rank_is_null ') ->orderBy('rank_is_null', 'ASC') ->addOrderBy('rank', 'ASC');;
rank_is_nullはrankがNULLの場合は1になり、NULLでない場合は0になります。
HIDDENなカラムをSELECTし、最初にorderByするのがポイントです。
これで項目がNULLの場合(=未入力)最後に持ってくるようソートができました。
CASE文が苦手が方もいると思いますが、これを期にマスターください!
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。