[CakePHP] モデル

タグ :

CakePHPの基礎をまとめるシリーズです。
今回はMVCのモデルについてです。
モデルにはデータベースに関係する処理を記述します。

バリデーション

バリデーションとは、データベース登録時の入力チェックなどのことです。
登録する場合のデータチェックとしては、以下を考慮してチェックします。

  • 名前はユニークである
  • 名前は必須入力である
  • (半角英数字のみ等)

これらをチェックするには、モデルにて以下のコードを記述します。

public $validate = array(
   'username' => array(
      'notempty' => array(
         'rule' => array('notempty'),
         'message' => 'Please input.',
      ),
      'unique' => array(
         'rule' => array('isUnique'),
         'message' => 'Registered already.',
      ),
      'harfWidthChar' => array(
         'rule' => array('custom', '/[^\\W]/u'),
         'required' => true,
      ),
   ),
);

「notempty」により、未入力の場合のエラーを返します。
「unique」により、既存データとの比較を行い、被りデータの場合にエラーを返します。
「harfWidthChar」により、半角文字の入力規制を行い、大文字などの場合にエラーを返します。

アソシエーション

CakePHPの最も強力な機能の一つとして、モデル間の関連をマッピングしてくれる「アソシエーション」という機能を通じてモデル間の繋がりを操作することができます。

[アソシエーションとは]

アプリケーション中で、異なるオブジェクト同士の関連を定義する事はよくあります。
例えば投稿サイトのデータベースを例にとると、ユーザーはたくさんの投稿情報を持っており、それらに対してのコメントは誰が書いたのかというユーザー情報を持っています。
そして、そのユーザーもまた投稿情報を持っています。
これらの関連を定義することで、直感的にデータにアクセスする事が出来ます。

データは様々なソースから取得する事が出来ますが、Webアプリケーションで最も一般的なストレージはリレーショナルデータベースです。

[リレーションシップの種別]

CakePHPには4つのアソシエーションがあります。

  • hasOne
  • hasMany
  • belongTo
  • hasAndBelongsToMany

アソシエーションは、アソシエーション名のクラス変数を生成することで定義されます。
以下のように定義します。

// [app/Model/User.php]
class User extends AppModel {
   public $hasMany = array(
      'UserImage' => array(
         'className' => 'UserImage',
         'foreignKey' => 'user_id',
         'conditions' => '',
         'order' => ''
      )
   );
}
// [app/Model/UserImage.php]
class UserImage extends AppModel {
   public $belongsTo = array(
      'User' => array(
         'className' => 'User',
         'foreignKey' => 'user_id',
         'conditions' => '',
         'fields' => '',
         'order' => ''
      )
   );
}

上記の例では、配列の最初の「UserImage」はどんな文字列でも動作します。
普通は、そのリレーションシップが参照するクラスと同じ名前を付けますが、各モデルのエイリアスはアプリケーション全体でユニークでなければなりません。

Cakeはアソシエーションを定義したモデルオブジェクト同士を自動的にリンクします。
例えば、Userモデルの中では、以下のようにして「User」モデルにアクセスできます。

$this->User->someFunction();

同じようにコントローラでも、関連モデルに簡単にアクセスできます。

$this->User->UserImage->someFunction();

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed