【CakePHP3】Collectionのmax(),min()関数は、最大値,最小値をもつ要素が複数あったとしても1要素しか返さない

Bake-with-CakePHP Logo

CakePHP3の便利なCollectionクラス。Collection化したオブジェクトはextract()やfilter()等の便利な関数を備えており、DBからselectしてきたデータの加工や抽出に一役買ってくれる。

今回はその中でもmax()関数とmin()関数の挙動についてメモを残しておく。検証したCakePHPのバージョンは3.6.13。

max(),min()関数の使いどころ

例えば

複数の記事レコードのうち、ページビュー数が最大のものを1件だけピックアップしたい

とする。

上記のようにMySQLのORDER BYとLIMIT 1を使う手もあるが、CollectionTraitをuseしているResultSetオブジェクトでも似たような表現ができる:

この書き方のほうがシンプルではあるが、where句である程度絞りこんでおかないとSQLが重くなりがちなので注意が必要。

 

max()関数を使った時にfirst()を呼ばなくても良い理由は、

そもそもmax(),min()関数共にfirst()関数を最後に呼び出すためである。覚えておこう。

最大値・最小値を2つ以上持つレコードがある時に、該当レコードを全て抽出したい時の書き方

最大値・最小値を複数持つレコードを全て抽出するためには、段階を踏んだコードを書く必要がある。やるならこんな感じ:

よほどの特殊な理由がない限りはA案を推奨。B案はSQLが重くなりがちなので。