hasAndBelongsToMany以下の配列

cakePHPはモデルにアソシエーションを設定すると、子や親のリレーション関係にあるデータも自動的に持ってきてくれるので便利です。
$recursive設定で、階層数やとってこないようにすることもできます。

しかし、hasAndBelongsToManyの場合は、とっては来るのですが、それをキーで囲まないため、「id」「title」と同じ並びに0,1,2と並んでしまいます。

cake/libs/model/datasources/dbo_source.phpの845行目あたり、

foreach ($merge as $i => $row) {
  if (count($row) == 1) {
    $data[$association][] = $row[$association];
  } else {
    $tmp = array_merge($row[$association], $row);
    unset($tmp[$association]);
    $data[$association][] = $tmp;
  }
}

を、

foreach ($merge as $i => $row) {
  if (count($row) == 1) {
    $data[$association]['HABTM'][] = $row[$association]; //<<<
  } else {
    $tmp = array_merge($row[$association], $row);
    unset($tmp[$association]);
    $data[$association]['HABTM'][] = $tmp; //<<<
  }
}

とすると、[HABTM]=array(,,,)と囲まれます。