CakePHP1.2でアソシエーションを絡めたcountでうまく件数がとれないときの話です。
例えば、User(ユーザー情報)とArticle(投稿記事情報)という2つのテーブルがあって、この2つのテーブルでアソシエーションを組んでるとします。
一覧ページなどで、ユーザーの情報とそのユーザーごとに投稿記事件数を取得したい場合、find(’all’)で取得する場合は
‘group’ => ‘Article.user_id’,
などgroupを適切なテーブルに指定することで取得できますが、一覧ページに表示する全件数を欲しい場合などで同じSQL文をfind(’count’)で取得する場合は正しい件数が返ってきませんでした。
CakePHP1.2の公式マニュアルを見ると、
find(’count’) では、 fields に配列を渡してはいけません。
DISTINCT カウントを行うフィールドだけを指定するようにしてください。そうすることで、条件に従った結果が常に同じになります。
‘fields’ => ‘DISTINCT Article.user_id’,
みたいに書いてあったのでその通りにしてみると件数はちゃんととれました。
が、しかし!!
Object of class stdClass could not be converted to int
というエラーが出てしまいました。(件数自体はちゃんととれている)
で、改善案としては、
‘fields’ => ‘DISTINCT Article.user_id’,
を
‘fields’ => ‘COUNT(DISTINCT Article.user_id) AS `count`’,
に変えてやるとエラーは出なくなりました。