質問: $this->Profile->read(); //1編集画面に、既に登録されている名前やメリット等の情報が出てこない } else { if ($this->Profile->save($this->request->data)) { //2保存をすると、ユーザーid(user_id)が「0」になってしまい、本来のユーザーidが格納されない。 $this->Session->setFlash('Success!'); $this->redirect(array('action'=>'index')); } else { $this->Session->setFlash('Failed!'); } } } //edit.ctp Form->create('Profile', array('action'=>'edit')); echo $this->Form->input('name'); echo $this->Form->input('merit'); echo $this->Form->input('career'); echo $this->Form->end('保存'); ?> ```
回答: はじめのProfileデータの読み込みを下記のようにすべきです。 ``` $profile = $this->Profile->find('first', ['Profile.user_id'=>$user_id]); ``` そして、(1)を ``` $this->request->data = $profile; ``` とし、(2)のときは ``` $this->request->data['Profile']['user_id'] = $profile['Profile']['user_id']; ``` とすべきです。 (1) Model::read()では遅延読み込みは行われません。 代わりにfalseが返ってきているのではないでしょうか。 Model::read()は必ず第1引数またはModel::$idが決まっていないと 何もせずにfalseを返すようになっています。 $this->request->dataがfalseなので、$this->Formで使われていない状態になっています。 (2) Model::save()ではModel::$idが先に得られ、 でも$this->request->data['Profile']['user_id']がないので、 結果的に該当idの行の'user_id'が0として保存されてしまいます。 サンプルでは'hidden'か何かで$this->Formに'user_id'が分かっていたか、 上記のようにModel::save()の直前で強制的に代入していたのではないでしょうか?