CakePHP1.1を使ってみて、特にController内のModelを理解するのに時間がかかりました。
ということで、そのまとめ。
まず、Controller内の「$this->Model」はModelクラスのインスタンスということ。
idが$idのデータを読み込む方法。
$this->Model->read(null, $id);
以下のコードも同じ結果になります。
$this->Model->id = $id;
$this->Model->read();
落とし穴は、自動的にid属性が設定される場合があること。
2回続けて保存したとき、1件しか登録されません。
$this->Model->save($this->data); //新規保存
$this->Model->save($this->data); //更新保存になる
原因は、1回目の「$this->Model->save()」で保存したときに「$this->Model->id」が自動的に設定されるため。
対策は、「$this->Model->id」をクリアするか、「$this->Model」を新規にすること。
「$this->Model->id」をクリアする方法。
$this->Model->save($this->data);
$this->Model->id = NULL;
$this->Model->save($this->data);
「$this->Model」を新規にする方法。
$this->Model->save($this->data);
$this->Model->create();
$this->Model->save($this->data);
「$this->Model」はインスタンスで、状態を持っていることに気がつけば、原因に気づくことができるでしょう。
次に関連モデルの結果を取得する方法について。
findAll()の6番目の引数で、取得する関連モデルの階層を指定することができます。
$this->Model->findAll(null, null, null, null, null, 2);
ただ、この方法だと「null, null, …, 」というのが、あまり見た目が良くないように思います。
$this->Model->recursive = 2;
$this->Model->findAll($conditions);
多少は見やすいのではないかと。
モデルの定義で、$recursiveの初期値を指定することもできます。
class モデル名 extends AppModel {
var $recursive = 2; //初期値を指定
他にも何かあったような気がしますが、忘れました。
思い出したら、追記します。