CakePHPでのコメント数表示について

このQ&Aのポイント
  • CakePHPを使って簡単な掲示板を開発している中で、トップページに各トピックについたコメント数を表示させる方法について困っています。
  • 掲示板とコメントのテーブル間にアソシエーションを貼り付けていますが、コントローラーで件数を取得するとコメントの数ではなく、掲示板の数を取得してしまいます。
  • また、テーブルの関連性から表示方法にも困っています。コメント数をトピックの横に表示させたいのですが、どのようなコードを書けば良いか分かりません。
回答を見る
  • ベストアンサー

CakePHPでのコメント数表示について

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です。 ・ ・ ・ となる為、ビューでの表示のさせ方にも困っております。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

あれ? hasMany の場合 join 構文にならないようです。hasOneで連結指定してください。

takeruhoge
質問者

お礼

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

takeruhoge
質問者

補足

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

その他の回答 (1)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

必要な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

takeruhoge
質問者

補足

1054: Unknown column 'Comment.post_id' in 'field list' と出てしまうようです。 ん~もう少し調べてみます。

関連するQ&A

  • CakePHPのブログチュートリアルについて

    PHPフレームワークのCakeについて、質問させてください。 初心者ならだれもが一度は試すであろうhttp://book.cakephp.org/ja/view/219/Blogに掲載されているブログチュートリアルですが、下記環境で実行すると大量のエラーが出力されます。(添付画像参照) 環境:hetemlレンタルサーバー Apache 2.0.xx ver 4.4.2 ※CakePHPのトップページが正常に表示されること、tmpフォルダのパーミッションは正常に設定されていることは確認しています。 また、Viewで正常にデータを取得できているにもかかわらずデータ表示部分でエラーが表示されるため、変数$postsをvar_dumpしたところ、 Array ( [0] => Array ( [id] => Array ( [id] => 1 ) [title] => Array ( [title] => タイトル ) [body] => Array ( [body] => これは、記事の本文です。 ) [created] => Array ( [created] => 2009-08-08 21:56:50 ) [modified] => Array ( [modified] => ) ) [1] => Array ( [id] => Array ( [id] => 2 ) [title] => Array ( [title] => またタイトル ) [body] => Array ( [body] => そこに本文が続きます。 ) [created] => Array ( [created] => 2009-08-08 21:56:50 ) [modified] => Array ( [modified] => ) ) [2] => Array ( [id] => Array ( [id] => 3 ) [title] => Array ( [title] => タイトルの逆襲 ) [body] => Array ( [body] => こりゃ本当に面白そう!うそ。 ) [created] => Array ( [created] => 2009-08-08 21:56:50 ) [modified] => Array ( [modified] => ) ) ) となっていました。 これでは、チュートリアルに掲載されている、 <?php echo $post['Post']['id']; ?> ではなく、 <?php echo $post['id']['id']; ?> で呼び出さなくてはならなくなります。 これはどこかがおかしいのでしょうか?教えてください。

    • 締切済み
    • PHP
  • cakephpでidに紐づけて記事を表示

    cakephpでblogアプリケーションを作成しています。 /blog/記事のID のURLをクリックすると該当の記事が見れるようにしたいです。 不思議なのですが、DB側のカラム名がid(blogのID名)だと正しく表示されるのですが、DBの値をnoやnooなどid以外の値にすると何も表示されません。 デバッグのSQLさえも何も表示されない状況です。 具体的なコードを記載します。 正しく表示される場合 コントローラ class PostsController extends AppController { public $helpers = array('Html','Form'); public function index(){ $this->set('posts',$this->Post->find('all')); } public function view($xxx = null){ $this->Post->id = $xxx; $this->set('post',$this->Post->read()); } } ビュー <h2><?php echo h($post['Post']['num']); ?></h2> <p><?php echo h($post['Post']['hel']); ?></p> モデル <?PHP class Post extends AppModel { } ?> 何も表示されない場合 コントローラ 以下だけが上記と異なります。 public function view($xxx = null){ $this->Post->no = $xxx; ★この部分 $this->set('post',$this->Post->read()); } ビュー・モデルは同上で、DBのカラム名をidからnoに変更しています。 データベースの中身は以下です。 以下のidをnoに変更した場合うまくいきません。 id num hel _________________ 3 4 hello world 21 21 abcde 0 3 okokokoko 何かアドバイスいただけないでしょうか。 viewを見る際に何もデバッグ情報が出ないので何が悪いのかもわからない状況です。

    • 締切済み
    • PHP
  • CakePHP 1.3について

    CakePHPが初心者です。 Views-userdetail-index.ctpにて <?php echo $form->create(null,array('type'=>'get','action'=>'./updateRecord')); ?> ~ <?php echo $form->textarea("User.remarks", array("cols" => 22,"rows" => 2)); ?> ~ を記述し、userdetail_controllerにて function updateRecord(){ if (!empty($this->data)){ $this->User->id = 1; $this->User->saveField('remarks','exists'); } else { $this->User->id = 1; $this->User->saveField('remarks','empty'); } $this->redirect('.'); } を記述しています。 しかし、どうしても「!empty($this->data)」の判別によってemptyとなってしまいます。 User.remarksの部分をUserdetailにして色々ためしましたが、どうしても値の受け渡しがうまくいかないのです。 どなたかご教授を宜しくお願い致します。

    • ベストアンサー
    • PHP
  • テーブルデータ表示

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • cakephpのアソシエーションについて

    cakephp について勉強中です。 初心者なのでぜひ教えていただきたいのですが、 ・[Profile]と[Image]というテーブルがあり、ProfileについてImagesとのアソシエーションが  hasmanyなのですが、 コントローラーで  $datas = $this->Profile->find("all"); $this->set("datas",$datas); とした場合、view側でProfileのデータもImageのデータも表示されるにはどうしたらよいのでしょうか。 今は <?php foreach($datas as $data):?> <?php echo $data['Profile']['id']; ?> <?php echo $data['Image']['id']; ?> <?php endforeach; ?> とやっていますが、Imageテーブルのデータが出ません。 大変基本的なことだとは思いますがご指導いただければと思います。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【WordPress】投稿がないカテゴリ非表示方法

    【WordPress】 投稿がないカテゴリー 非表示 方法 カテゴリーの1つを決め すべての子カテゴリーと投稿を表示させる際に、 子カテゴリー内に投稿がない場合、 子カテゴリー名を表示させないようにしたいです。 下記のソースでうまくいきませんでした。 <?php $chihirdren=get_categories( 'parent=5&hide_empty=0&orderby=slug&order=DESC'); foreach($chihirdren as $child){ ?> <?php if(have_posts()):?> <h2><?php echo $child->cat_name ?></h2> <?php else: // no post ?> <?php endif; ?> <?php $wp_query->query(array('cat'=>$child->cat_ID,'posts_per_page'=>-1)); while ($wp_query->have_posts()) : $wp_query->the_post(); ?> <h3><?php the_title(); ?></h3> <?php endwhile; } ?> 大変申し訳ございません。 ご教授をお願いいたします。。

    • ベストアンサー
    • PHP
  • WordPress PCとスマホで表示を切り替える

    PCでは記事一覧5件、スマホでは3件表示するようにしたいです。 条件分岐タグを使って、PCとスマートフォンで記事の一覧表示を切り替える方法がうまくいきませんでした。 https://handywebdesign.net/2017/11/wp-is-mobile/ 改造前のコード(問題なく表示できました) <ul> <?php $latest_posts = get_posts( array( 'posts_per_page' => 5, // 表示する記事の数 'category_name' => '投稿ID',// 投稿IDを取得 'fields' => 'ids', ) ); foreach( $latest_posts as $post ): setup_postdata( $post ); if( has_post_thumbnail() ) { $post_thumb = get_the_post_thumbnail( '', 'post_thumbnail' ); // アイキャッチがあるときはアイキャッチを表示 } else { $post_thumb = '<img src="' . get_template_directory_uri() . '/img/noimage.gif" width="100" height="100" alt="デフォルト画像" />'; // アイキャッチがないときは《noimage.gif》を表示 } $post_categories = get_the_category(); // カテゴリーを取得 $post_content = wp_trim_words( get_the_content(), 30, '…' ); // 30字分を抜粋 ?> <li <?php post_class(); ?>> <a href="<?php the_permalink(); ?>"> <div class="blogListimg"> <?php echo wp_kses_post( $post_thumb ); ?> </div> <!-- アイキャッチここまで --> <p class="post-time blogDt"><?php the_time('Y.m.d'); ?></p> <p class="post-categories blogCt"><?php echo esc_html( $post_categories[0]->name ); ?></p> <h3 class="post-title"><?php the_title(); ?></h3> <p class="post-content blogBf"><?php echo esc_html( $post_content ); ?></p> </a> </li> <?php endforeach; wp_reset_postdata(); ?> </ul> PCとスマートフォンで記事の一覧表示を切り替えるコード 参考サイトを参考にfunctions.phpにfunction is_mobile() コードを追加。 トップページのphpに以下を改造。 <?php if ( is_mobile() ) : ?> <?php $latest_posts = get_posts( array( 'posts_per_page' => 5, // 表示する記事の数 'category_name' => '投稿ID',// 投稿IDを取得 'fields' => 'ids', ) ); foreach( $latest_posts as $post ): setup_postdata( $post );  ・  ・  ・ <?php else: ?> <?php $latest_posts = get_posts( array( 'posts_per_page' => 3, // 表示する記事の数 'category_name' => '投稿ID',// 投稿IDを取得 'fields' => 'ids', ) ); foreach( $latest_posts as $post ): setup_postdata( $post );  ・  ・  ・ <?php endforeach; wp_reset_postdata(); ?> </ul> 結果は真っ白になってしまいました。 HTMLソースも真っ白です。 空白はSublime Textのテキストエディターを使っていますので、確認しております。 どこが違うか、教えてくださいますか? よろしくおねがいします。

    • ベストアンサー
    • PHP
  • headerをページによって表示、非表示にする

    トップページのみヘッダーのjavasprictを使い、他ページでは非表示にしたいのですが、header.phpをもう一つ作り(javaのタグが入ってないもの)別名で保存し、header.phpと同じデレクトリーに保存しページの<?php get_header(); ?>の部分を<?php get_header1(); ?>に変えたのですがエラーでした。 これはどうすれば別々に見る事ができるでしょうか?? 今のページ設定は以下になってます。 <?php get_header(); ?> <div class="span-24" id="contentwrap"> <div class="span-14"> <img src="http://pimpkidz.com/wp/wp-content/uploads/2011/08/side.jpg" /> <div id="content"> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div <?php post_class() ?> id="post-<?php the_ID(); ?>"> <div id="indexthumb"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_post_thumbnail(array( 200,200 ), array( 'class' => 'post_thumbnail' )); ?></a></div> <div id="indexcontent"> <h2 class="title"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2> <p class="postdate"><span><?php the_time('Y/n/j(D)') ?> </span></p> <div class="entry"> <?php echo excerpt(40); ?> <div class="readmorecontent"> <a class="readmore" href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">Continue</a> </div> </div> </div> <div style="clear:both;"></div> </div><!--/post-<?php the_ID(); ?>--> <hr><?php endwhile; ?> <?php else : if ( is_category() ) { // If this is a category archive printf("<h2 class='pagetitle'>Sorry, but there aren't any posts in the %s category yet.</h2>", single_cat_title('',false)); } else if ( is_date() ) { // If this is a date archive echo("<h2 class='pagetitle'>Sorry, but there aren't any posts with this date.</h2>"); } else if ( is_author() ) { // If this is a category archive $userdata = get_userdatabylogin(get_query_var('author_name')); printf("<h2 class='pagetitle'>Sorry, but there aren't any posts by %s yet.</h2>", $userdata->display_name); } else { echo("<h2 class='pagetitle'>No posts found.</h2>"); } get_search_form(); endif; ?> </div> </div> <?php get_sidebars('right'); ?> </div> </div> <?php get_footer(); ?> もし他のソースが必要でしたら言ってください。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHP2について

    viewにデータを送るときに、1の $this->set() と2の $this->request->dataは、 どう違うのでしょうか? ご教授ください。 public function view($id = null) { // レコードを選択 $this->Post->id = $id; // レコードデータを取得しビューへ送る $this->set('post', $this->Post->read());---------1 } public function edit($id = null){ $this->Post->id = $id; if($this->request->is('get')) { $this->request->data = $this->Post->read();-------2 }

    • ベストアンサー
    • PHP
  • cakePHPでアソシエーションが出来ない

    2つのモデル間でのhasMany-belongsTo のアソシエーションが出来ずに困っています。(cakephpのバージョンは2.4.4, php5.4,16, mysql 5.5.32) 2つのモデルは、コントローラーからそれぞれのindex()で表示できますが、外部キーで相手を指せていないようです。親からのfind('all')で、親の値しか変数に入ってきません。表記や考え方がおかしいのかもしれません。規約には沿っているつもりですので外部キーを入れないアソシエーションの指定(両モデルに対して)も試してみましたがダメでした。以下に、2つのテーブルとモデルを書きます。おかしいところを指摘して頂けると助かります。 ・GiiGestモデルにGiiPostモデルが多数ぶら下がっている構造です。(1:n) GiiGestモデル テーブル名:gii_gests  フィールド:id 主キー autoincrement ,neme varchar(128) ファイル名:gii_gest.php クラス名:GiiGest <?php class GiiGest extends AppModel{ // public $hasMany = 'GiiPost'; <- これだけでもダメでした。 public $hasMany = array( 'GiiPost' => array( 'className' => 'GiiPost', 'foreignKey' => 'gii_gest_id', <- ここいいのか疑問です? ) ); } GiiPostモデル テーブル名:gii_posts  フィールド:id 主キー autoincrement, gii_gest_id int not null ,comment varchar(255) ファイル名:gii_post.php クラス名:GiiPost <?php class GiiPost extends AppModel{ // public $belongsTo = 'GiiGest'; <- これだけでもダメでした。 public $belongsTo = array( 'GiiGest' => array( 'className' => 'GiiGest', 'foreignKey' => 'gii_gest_id' ) ); }

    • ベストアンサー
    • PHP

専門家に質問してみよう