アプリ版:「スタンプのみでお礼する」機能のリリースについて

CakePHPを使って簡単な掲示板を開発しているのですが、トップページに
各トピックについたコメント数を表示させる方法で壁にぶち当たってしまっております。

データの取り出し方及び表示方法について教えて頂ければと思います。

DB構造(モデル)としては、
====================================
■掲示板(post.php)
テーブル:posts
id
title
contents

■コメント(comment.php)
テーブル:comments
id
post_id
comment
====================================
となっており、postsにhasMany、commentsにbelongsToで
アソシエーションを貼ってあります。

コントローラー(posts_controller.php)では、

====================================
$data = $this->Post->find('all',array('order' => array('Post.id' => 'desc')));
$this->set('data',$data);
====================================
という処理を行い、

ビュー(/posts/index.ctp)では、
====================================
foreach($data as $val){
echo "<tr>";
echo "<td><a href='{$val['Post']['id']}'>$val['Post']['title']</a></td>";
echo "</tr>";
}
====================================

としています。
これで、トップページに行くと掲示板トピックスのタイトルの
一覧は表示できるのですが、その横についたコメント数を表示
させたいのです。

例)掲示板のタイトルです(13)

上記のように(○)とさせたいのです。


コントローラーの所でallではなくcountにすることで件数を取りだす
ことができる所まではできるのですが、
$cnt = $this->Post->find('count',array('order' => array('Post.id' => 'desc')));

などとやっても本来取り出したいcommentsではなくpostsの件数を取りだす
ことになってしまっています。

また、hasManyを利用すると、

Array(
[0] => Array(
[post] => Array(
[id] => 1
[title] => 掲示板のタイトルです
[contents] => 掲示板の内容です
[comment] => Array(
[0] => Array(
[id] => 1
[post_id] => 1
[comment] => コメント1です。
[1] => Array(
[id] => 2
[post_id] => 1
[comment] => コメント2です。




となる為、ビューでの表示のさせ方にも困っております。

A 回答 (2件)

必要なsql文は以下


(ただし、MySQL, SQLiteを想定、これ以外のgroup化されてないカラムがあるとエラーになるデータベースシステムの時は、max(p.title) as title, max(p.contents) as contents, のようにする。)

select p.id, p.title, p.contents, count(c.post_id) as cnt
from posts as p left join comments as c on p.id=c.post_id
group by p.id order by p.id desc ;

これと同等のSQL文を作成してくれるようにfindの$paramを調整、
1.posts に $hasManyか$hasOneで Comment を指定すると、上記のleft join 条件になる
2.group指定、field指定を以下のように
$data = $this->Post->find('all'
, array('order' => array('Post.id' => 'desc')
, 'group'=>'Post.id'
, 'fields'=> array('Post.id', 'Post.title','Post.contents', 'count(Comment.post_id) as countComment')
));

→ 結果 $data[lineNo][modelName][columnName] の3次元配列
count関数カラムは、 modelName = 0, columnName = aliasName

この回答への補足

1054: Unknown column 'Comment.post_id' in 'field list'

と出てしまうようです。
ん~もう少し調べてみます。

補足日時:2011/05/17 23:16
    • good
    • 0

あれ? hasMany の場合 join 構文にならないようです。

hasOneで連結指定してください。

この回答への補足

色々試してみたのですが、やはりhasOneだと思う結果を出せないです。。

補足日時:2011/05/21 01:03
    • good
    • 0
この回答へのお礼

再度やり直したら無事できました(T T)/
本当にありがとうございました。

お礼日時:2011/05/21 11:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!