CakePHPのModelのわかりにくいところ

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; //初期値を指定

他にも何かあったような気がしますが、忘れました。
思い出したら、追記します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください