関連したレコードのカウント
バージョン
CakePHP 3.8
leftJoinWithを使う
CakeBookにはこんな感じで書いてありました。
$query = $articlesTable->find(); $query->select(['total_comments' => $query->func()->count('Comments.id')]) ->leftJoinWith('Comments') ->group(['Articles.id']) ->enableAutoFields(true); // 3.4.0 より前は autoFields(true); を使用
参考
https://book.cakephp.org/3.0/ja/orm/query-builder.html
これで、articlesにtotal_commentsというカラムが追加されて件数が入るわけだ。
いや、これだけだったら問題ないんだけど・・・
問題1.検索に使えない
例えば、total_commentsが10件以上の記事だけ出したいという場合
->where(['total_comments >'=>10])
って感じで追加すると思うんですが、これがダメ。
無いって言われる。
モデル名を付けたりいろいろ記述方法を変えたり順番を変えたりいろいろ試したけど、方法がわからず…。
問題2.複数のモデルで使おうとすると重複してカウントされてしまう。
たとえば、記事に”いいね”カウントがあって、Commentsとテーブルと同じような仕組みで管理していたとすると、
上記のコードと同じような感じで、”いいね”モデルも一緒にカウントさせようとすると、なぜか数が倍になる。