アソシエーションで2階層以上の値を取得するにはread()ではなくfind()
環境
- win XP
- xampp 1.7.3
- cakephp 1.2
前提となるアソシエーション
- Question hasMany Answer
- Answer belongsTo User
bakeされた直後のコード
function view($id = null) { if (!$id) { $this->flash(__('Invalid Question', true), array('action' => 'index')); } $this->set('question', $this->Question->read(null, $id)); }
上記をQuestion VIEWのRelated部分で下記のように取得すると、エラー
foreach ($question['Answer'] as $answer): (中略)link($answer['User']['name'], array('controller' => 'users', 'action' => 'view', $answer['User']['id'])); ?>
エラーメッセージ
Notice (8): Undefined index: User [APP\views\questions\view.ctp, line 67]
原因
モデルのメソッドread()は、アソシエーション階層を1しか取得しないため。
Question['Answer']['user_id]は取得できるが、Question['Answer']['User']['id']は取得できない。
対処
read()の部分を、findにし、階層を表すパラメータrecursiveに2を設定する。
function view($id = null) { if (!$id) { $this->flash(__('Invalid Question', true), array('action' => 'index')); } $param = array( 'conditions' => array('Question.id' => $id), 'recursive' => 2 ); $this->set('question', $this->Question->find('first', $param)); }