質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

Viewで設定したhiddenの値をControllerでDBに登録したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,028
退会済みユーザー

退会済みユーザー

お世話になります。

現在cakePHPを始めて3カ月の初心者です。
以下のシステムを作成していますが
途中で躓いた為ご教示いただけますと助かります。

◆完了していること
・掲示板を作成
・記事1つに対してコメントを投稿できるよう投稿欄作成(記事はPostというDBに登録、コメントはCommentというDBに登録)
(記事が親、コメントが子といった関係性かと思います)
・コメントを投稿するとCommentに登録される

◆つまづいている箇所
・Postというテーブルに「id」というカラムがあります。
Post.php(Model)で、$hasManyのforeignKeyに「post_id(Commentテーブルのカラム)」を設定し、
Postテーブルのid = 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)】
<?php
echo $this->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) コメント機能を実装

変なコードを書いていると思いますがご教示いただきますと助かります。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • popobot

    2017/06/15 05:29

    CakePHPのバージョンはいくつでしょうか? また、そもそもフォームでpost_idを入力しないのであれば、どうやってpost_idを決めるのでしょうか。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/06/20 17:09

    バージョンは2.4.6です。Postテーブルの「id」とCommentテーブルの「post_id」を$hasManyでイコールにしているのですがこちらでは不十分でしょうか・・?

    キャンセル

回答 2

checkベストアンサー

+1

ドットインストールがやろうとしていることは、記事の詳細ページ(View/Posts/view.ctp)に「コメント投稿パーツ」を追加しています。ariapianoさんは、別のctpファイルにしていませんか? 記事の詳細ページには、$postに記事の情報を持っているため、以下のようにコメント投稿のhiddenにpost_idを入れることができます。

echo $this->Form->input('Comment.post_id', array('type'=>'hidden', 'value'=>$post['Post']['id']));

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/21 10:03

    ありがとうございます。
    (View/Posts/view.ctp)に入力はしていたのですが、検索して出てくるコードを入力しても全くダメでした。昨夜載せていただいたコードと同じコードを別サイトで見つけ試したところ解決しました!
    どうもありがとうございました。

    キャンセル

0

`$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列にインクリメント設定が可能なようです。
下記、参考にしてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/19 16:47

    ありがとうございます。
    少々投稿文を編集させていただきましたが、
    $hasManyでForeignKeyを設定している場合、「$this->request->data」といった難しい考え方をしなくてもいいのでしょうか?
    記事のテーブルにある「id」カラムとコメントテーブルの「post_id」を$hasManyのForeignKeyでイコールにしており、Viewにてhiddenで「post_id」を持たせるとコメントテーブルに登録されるコメントは「post_id」(記事のid)が登録される。
    というのが理想なのですが・・。情報が足りずすみません。よろしくお願いいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る