count() メソッドは limit、 offset、 page 句を無視する?

CakePHP4で、データのエクスポートをするためにlimit()とpage()を組み合わせてcount()で残りの数を見ながら出力していたのだけど、なんか終了しない。

むむむ?と思って調べてみたら。

count() メソッドは limit、 offset、 page 句を無視します。

なんでやねん!

別の Query オブジェクトを構築する必要なく、結果セットの合計数を前もって知ることが できるので便利です。同様に、結果のフォーマット (result formatting)、Map/Reduce 処理は count() を使う際には無視されます。

いやいやいや、不便だろ。合計数が知りたきゃlimitを外したQueryオブジェクトで先に取得しておくなり、limitを消すなりすればいいだけじゃん。
100歩譲ってこれを是として、じゃあ limit、 offset、 page 句を加味した件数を知りたい場合はどうしたらいいのか?が書いてない。

軽く調べてみたけど、この制限を解除する方法が分からず。
苦肉の策として、出力結果を配列に変換してcount()関数でカウントすることにしました。

$users = $this->Users->find()->where([なんか条件])->limit(100)->page($page);
if(count($users->all()->toArray()))

こんな感じで。
処理負荷を考慮しなくていいのならまぁ別にこれでもいいでしょう。
->select([‘id’]) とかしておけばデータを減らせるのでなおよしだとおもいます。

Cakeってこういう直感に反した理解に苦しむ実装が多いからだんだん嫌われてるんだろうなぁ。

タイトルとURLをコピーしました