アソシエーションで2階層以上の値を取得するにはread()ではなくfind()

環境

前提となるアソシエーション

  • 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));
}