Home > CakePHP | PHP > CakePHP Modelに関する6つの誤解

CakePHP Modelに関する6つの誤解

この記事の所要時間: 327

CakePHPのModelはActiveRecordライクなDBアクセス方法を提供しており、さらにアソシエーションを設定することにより複数テーブルの値を同時に操作できるなど、DB操作に対するインターフェイスが数多くあります。

ただ「手軽にDB操作ができる」という印象が先行しているゆえ誤解を招くことがあるようです。

1. クラス名に対応したテーブルしか操作できない

Modelのクラス名とテーブルを自動でマッピングするのはフレームワークのいわば便利機能です。デフォルトでそのような動作をするだけで、容易に変更することができます。

Model#$useTableにテーブル名を指定すれば任意のテーブルを操作できます。

<?php
class Foo extends AppModel {
  public $useTable = 't_user'; // t_userテーブル
}
?>

2. DBを使わないといけない(DB操作が無いと使えない)

DB操作が強調されるので陥りがちですが、DBを使わないModelも作成できます。例えばバリデーションだけを行うModelやDB操作を行わないビジネスロジックを実装したModelなどももちろんokです(というかビジネスロジックを実装するもの)。

DB操作を行わないModelでは、Model#$useTableにfalseを入れておけば良いです。(nullではなく、falseです)

<?php
class Foo extends AppModel {
  public $useTable = false; // テーブルに対応させない
}
?>

3. ステートレスである

find()/findAll()等ではarrayを返すので、何となくステートレスな感じがしたりしますが、実はModelではしっかり情報を保持しています。

メソッド終了時にリセットされる値も一部ありますが、Model#set()などで設定した値はそのまま保持しています。ループの中で複数レコードを登録する際は注意する必要があります。

保持している値についてはModel#create()を呼ぶことにより初期化(クリア)できます。

<?php
    foreach ($list as $data) {
      $this->Foo->create();  // クリアしておく
      $this->Foo->save($data);
    }
?>

4. bakeで生成したModelは変更しない(できない)

bakeでバリデーションやアソシエーションを設定しておくと、生成されるModelではインスタンス変数に様々な値が記述されます。

単純なDB操作のみならばこのままModelのソースを触ることなく開発できますが、複雑なDB操作やビジネスロジックなどを実装する場合は、臆することなくModelにガンガン追加していきましょう。

5. DBのリレーションを全てアソシエーションでも設定する

アソシエーションはとても便利なものですが、上手く利用しないと思わぬSQLが発行され、パフォーマンスに影響が出ます。テーブル同士に外部整合性制約を付けてリレーションしているからと言って、必ずアソシエーションを設定する必要はありません。

はじめからシステムで不要と思われるアソシエーションについては設定しないというのも手です。

いっそ最低限のアソシエーションのみを設定しておき、後は用途に応じてModel#bind()/bindModel()する方が良いかもしれません。

特にModel#$hasManyを設定していると芋づる式に数多くのSQLが発行される場合があるので、注意しましょう。

6. DAOである

DAOのように振る舞うメソッドが多数ありますが、実際にDBへアクセスするのはDataSourceを継承したdboクラスであり、Modelではありません。

ModelをDAOとしか認識していないと、ビジネスロジックはControllerに実装することになり、Controllerが肥大していくことになります。

もちろんModelをDAOのように使うこともできますが、あくまでModelですので、ビジネスロジックはControllerでなくModelで実装して、Controllerへはそのインターフェイスを提供するようにしましょう。

CakeのModelはMVCのModel

しつこく書いてますが、CakeのModelもいわゆるMVCのModelと同じです。DB機能ばかりが強調されていますが、それに捕らわれることなく本来のModelとして活用しましょう。

Pocket

follow us in feedly

コメント (Close):1

Loriann Weiman 11-06-18 (土) 15:56

Its like you read my mind! You seem to know so much about this, like you wrote the book in it or something. I think that you could do with some pics to drive the message home a little bit, but instead of that, this is magnificent blog. A great read. I will definitely be back.

トラックバック:1

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2008/04/cakephp_model_6misinformation.html/trackback
Listed below are links to weblogs that reference
CakePHP Modelに関する6つの誤解 from Shin x blog
pingback from CakePHPをはじめて使ってみたことのまとめ | rui live note 12-04-09 (月) 21:40

[…] CakePHP Modelに関する6つの誤解 – Shin x blog […]

Home > CakePHP | PHP > CakePHP Modelに関する6つの誤解

検索
フィード
メタ情報

Return to page top