質問: Commentテーブルのpost_id** という状況になっているかと思います。 コメント投稿をした際にhiddenで「post_id」持たせ、コメントを登録するとCommentテーブルの 「post_id」カラムに投稿した記事のid(Post)が登録され、どのコメントがどの記事のものであるか 判別できるようにしたいのですが、 今現在、DBにコメントは登録されるものの、Commentテーブルの「post_id」は「0」になってしまい どのコメントがどの記事のものであるか分からない状態です。 上記でも書いているように、 Post.php(Model)で、$hasManyのforeignKeyに「**post_id**(Commentテーブルのカラム)」を設定 しているのでViewで「echo $this->Form->hidden('Comment.post_id');」と書けば Postテーブルのidがhiddenで送信出来ると思っているのですがそもそも間違っていますか? **〇view**【hiddenでpost_idを持たせたい(Postテーブルのid)】 Form->create('Comment',array('url'=>array('controller' => 'comments', 'action' => 'add'))); echo $this->Form->hidden($post['Post']['id']); echo $this->Form->input('name',array('label'=>'名前')); echo $this->Form->input('comment',array('label'=>'コメント')); echo $this->Form->end('コメントを投稿する'); ?> **〇Controller**【viewで設定したhiddenの値を受け取ってCommnetテーブルの「post_id」カラムに格納したい】__ public function add() { if($this->request->is('post')){ if($this->Comment->save($this->request->data)){ $this->Session->setFlash('投稿されました'); $this->redirect($this->referer()); } } } Controllerでどのように書いたらhiddenの値を受け取ってCommnetテーブルの「post_id」カラムに格納出来るのか 分からずずっと悩んでいます。 こちらと同じ事がしたいのですがpost_idが「0」になってしまいます。 ***http://www.grooving-earth.com/cakephp-lesson/#19*** *19) コメント機能を実装* 変なコードを書いていると思いますがご教示いただきますと助かります。 よろしくお願いいたします。
回答: ``$this->request->data`はPOSTデータの配列ですよね。 POST送信されていないと何も入っていない状態だと思いますよ。 おそらくカラムが数値型で初期値が0であるため自動で0が入るんだと思います。 どうしてもhiddenに指定したい場合は作る側が自身で振ってあげる必要がありますが、 同時に投稿された場合、IDが重複する現象があるため好ましくありませんし、 hiddenにしてしまうとHTMLで見えるので自由に改ざんできてしまいます。 データベースのバージョンによりますが、 例えばMySQLであればidをオートインクリメントにしておけば自動で振られるため登録時にIDを意識する必要はありません。 PostgreSQLであればシーケンスをnextval()でとる方法があります。 いずれもCakePHPで実現可能と思います(別途調べてみてください) また、 > > どのコメントがどの記事のものであるか分からない状態です。 > > > このコメントから、idがPKとなっていないと推察されます。 PKにしておけば登録時にDBからエラーが返ってきますし、 一意なのであればなおさらPKにすべきです。 おそらくDBの構造から調整が必要なりますが、より安全で簡潔な仕組みとなるはずですのでご検討ください。 追記: 失礼。タグにDB2がついてましたね。 DB2環境がないので検証ができなくて申し訳ないのですが、ID列にインクリメント設定が可能なようです。 下記、参考にしてください。 * DB2 ID列に自動採番