« 数学に感動する頭をつくる | メイン | A4サイズで1年分が1枚におさまるカレンダー »

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

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

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/684

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年01月07日 14:22に投稿されたエントリーのページです。

ひとつ前の投稿は「数学に感動する頭をつくる」です。

次の投稿は「A4サイズで1年分が1枚におさまるカレンダー」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35