モデル

ZF-Exではリソースへのアクセスのため、Modelを使用しています。この項目ではそのModelの利用方法や拡張方法について説明します。

ファイル構造

Modelに関連するファイルは次の箇所にあります。

  • application
    • models
    • AppModel.php

Modelクラスはmodelsディレクトリ配下にあり、これらの基底のクラスとしてAppModelがあります。

基本的な使用方法

Modelの基本的な操作である、データの取得・追加・更新の方法について説明します。

データの取得

データの取得には複数の状況が考えられます。特定の条件を加えた上で1件あるいは全件取得したい場合は、次のようなメソッドをモデル中に作成します。

/**
 * public_flgが1で、公開状態であるデータを全て取得する。
 */
function getPublicData(){
    $select = $this->_db->select(); // セレクタを取得する
    $select->from($this->_name); // テーブル名をセットする
    $select->where('public_flg = ?', self::PUBLIC_FLG_ON); // public_flgが1であることの条件をセットする。
    $select->where('delete_date IS NULL'); // 論理削除されていないこと
    return $this->getAll($select->__toString()); // 
}

データを取得するとき、Zend_Db_Selectでオブジェクトを取得し、それによりSQL文を生成します。Zend_Db_Selectの詳細は下記ページをご覧ください。

http://framework.zend.com/manual/ja/zend.db.select.html

条件を設定してデータを取得する場合はこのようにメソッドを作成する必要がありますが、特定の条件でデータを取得するメソッドも用意されています。主キーを元にデータを1件取得するAppModel::getByPrimal($id)メソッド、キーと値を指定し、配列として返すAppModel::getList($key, $value, $cond = array(), $order = false)メソッドがそれにあたります。

ページング処理を行った上でデータを取得したい場合、コントローラ中でpaginatorを設定します。設定方法の詳細はページング・ソーティングについての項目をご覧ください。

データの追加

データの追加にはinsertメソッドを使用します。ZF-Exではinsertやupdate時に入力内容のチェックは行いません。行う前にisValidメソッドを使用して入力チェックを行うようにして下さい。

データ追加は次のように行います。

$data = array('field_1' => 'val_1', 'field_2' => 'val_2'); // insertする値
$model = new Model_Test();
$id = $model->insert($data); // $idには主キーが入る

データの更新

データの更新にはupdateメソッドを使用します。updateメソッドでは第二引数で主キーを指定することで対象のデータの更新を行います。

$data = array('field_1' => 'new_val_1', 'field_2' => 'new_val_2'); // insertする値
$model = new Model_Test();
$id = $model->update($data, $id); // $idには主キーが入る

データの削除

データの削除にはdeleteメソッドを使用します。データの削除は次のように行います。

$model = new Model_Test();
$model->delete($id);

なお、データの削除はデフォルトでは論理削除になり、物理削除とするには設定を変更する必要があります。

メンバ変数の設定

AppModel内には次のメンバ変数が設定されています。これらのモデルクラス内にあるメンバ変数を変更する事で、各モデルの挙動を変更可能です。

protected $_db;
protected $_cache;
protected $_validator;
protected $_name = 'app';
protected $_primary = 'id';
protected $_list_cache = false; // listで配列を取得する時、キャッシュを使用するかどうか。デフォルトはfalse
protected $_savedate = true; // careate_dateとupdate_dateのカラムを保持しているか。デフォルトはtrue
protected $_deletedate = true; // 論理削除値を保持しているか。デフォルトはtrue
protected $_search_cond = array(); // 検索の条件を示す配列
protected $_search_delimiter = ' '; // 検索で複数キーワードを指定する時のデリミタ
protected $_default_order = false; // 一覧取得する時のデフォルトのorder条件。デフォルトはfalse
protected $_exclude_fields = array(); // 情報を保存する時、保存対象から除外するフィールド

$_db

dbアダプタのオブジェクトをセットします。

$_cache

キャッシュのオブジェクトをセットします。

$_name

対象となるテーブル名を入れます。

$_primary

対象のテーブルで主キーとなるフィールドの名前です。デフォルトではidとなっており、これを変更しない限り指定する必要はありません。

$_list_cache

getListメソッドでリストを取得する際、そのリストをキャッシュで保持するかの情報です。有効にするとgetListメソッドを使用した時にリストがキャッシュに保存されます。デフォルトでは無効となっています。

$_savedate

テーブルで登録時刻や更新時刻を利用するかの情報です。有効にすると、追加時や更新時に登録時刻create_dateと更新時刻update_dateに対して情報を追加します。デフォルトでは有効となっています。

$_deletedate

テーブルに削除時刻を含むかの情報です。有効にすると削除が論理削除となり、削除時に削除時刻delete_dateに時刻を追加するようになります。デフォルトでは有効となっています。

$_default_order

データを取得するときのデフォルトの表示順位の条件です。

$_exclude_fields

データを保存するとき、保存対象外とするフィールドです。

フィールド情報の設定

各モデル中にメンバ変数としてDBテーブルのフィールド情報を記述します。フィールド情報の例は次の通りです。

protected $fields = array(
                        array('key'      => 'field_1',
                              'validate' => array('NotEmpty', 'Code', array('StringLength', 0, 64))
                        ),
                        array('key'      => 'field_2',
                              'validate' => array('NotEmpty', array('StringLength', 0, 128))
                        ),
                        array('key'      => 'field_3',
                        ),
);

keyの値にフィールド名(テーブルのカラム名)を記述します。validateは省略可能で、バリデーションチェックについての設定を記述します。詳細はバリデータについての項目をご覧ください。

ここに記述したものの他に、次のフィールドが自動的に使用されます。

id

そのテーブルの主キーとなります。主キーの名前を変更する場合、メンバ変数の$_primaryを変更して下さい。

create_date, update_date

そのレコードの作成時刻、更新時刻となります。create_dateはinsert時にその時刻がセットされ、update_dateはinsert及びupdateの時にその時刻がセットされます。メンバ変数の$_savedateをfalseにするとこれらのフィールドは使用されなくなります。

delete_date

そのレコードの論理削除の時刻となります。このフィールドに日付がセットされていた場合、論理削除されたものと扱われます。ただし、Zend_Db_Selectのオブジェクトを取得して自分でSQLを作成する場合は上にある例のように論理削除についても条件を設定する必要があります。メンバ変数の$_deletedateにするとこのフィールドは使用されなくなり、処理が物理削除へと変更されます。

$_exclude_fieldsについて

$_exclude_fieldsは不正入力への対策として設定します。POSTされてきたデータを保存する際に特定のフィールドを更新対象としたくない場合、通常はそのようなフィールドの名前を画面上で隠ぺいしますが、それだけではツール等による不正入力は防げません。このような時、$_exclude_fieldsに除外対象となるフィールド項目を設定する事により、保存用にデータを成型する際に除外されます。$_exclude_fieldsの項目を変更するにはAppModel::getExcludeFields();, AppModel::addExcludeFields($field);, AppModel::unsetExcludeFields($field = array());のメソッドを参照ください。

他のテーブルとの連結について

他のテーブルと連結させてデータを取得したい場合、Zend_Db_Selectのjoinに基づいて連結の設定を行います。連結はsetJoin($select)メソッドに記述します。連結を行いたいモデルにsetJoin($select)メソッドを作成し、オーバーライドします。

public function setJoin($select){
    $select->join(array('t' => 'test'), $this->_name . '.test_id = t.id', array('t1.name AS test_name'));
    return $select;
}

setJoin($select)メソッドはgetByPrimal()メソッドやページングを取得する際に自動的に呼び出されます。他の処理でテーブルの連結を行いたい場合、適宜setJoin()メソッドの呼び出しや個別に連結の設定を行うようにしてください。

メソッドリファレンス

AppModel::getOne($sql);

$sqlの実行結果のうち、最初の1件を取得します。0件であった場合にはfalseを返します。

AppModel::getAll($sql);

$sqlの実行結果のうち、全件を取得します。0件であった場合にはfalseを返します。

AppModel::getByPrimal($id);

主キーの$idによる絞り込みを行い、1件取得します。0件であった場合にはfalseを返します。

AppModel::getList($key, $value, $cond = array(), $order = false);

テーブルからデータを全件取得し、$keyをキーとしたリストとして返します。また、$_list_cacheを有効にしている場合はこの一覧結果をキャッシュへと保存します。

AppModel::getLastUpdate();

最後に更新したレコードを取得します。

AppModel::makeSaveData($data);

$dataの配列を、テーブルへの保存用に成形します。フィールドに含まれない項目を削除し、登録時刻create_dateや更新時刻update_dateを追加します。insertやupdateの直前に実行されるため、通常は単体で呼び出す必要はありません。

AppModel::insert($data, $makesavedata = true);

レコードに$dataを新規追加します。

AppModel::update($data, $id, $makesavedata = true);

レコードの対象のデータを更新します。

AppModel::delete($id);

レコードの対象のデータを削除します。論理削除とするか物理削除とするかはメンバ変数$_deletedateの設定によります。

AppModel::getName();

テーブル名を取得します。

AppModel::getPrimaryWhere($id);

主キーを指定したwhere文をエスケープして返します。

AppModel::getQuote($str, $val);

$str = $valとなるwhere文をエスケープして返します。

AppModel::isValid($data, $fields = null);

バリデーションの入力チェックを行います。バリデーションの処理についてはバリデーションについての項目をご覧下さい。

AppModel::getExcludeFields();

保存対象の除外となるフィールドを取得します。

AppModel::addExcludeFields($field);

保存対象の除外となるフィールドを追加します。stringまたはarrayを引数とします。

AppModel::unsetExcludeFields($field = array());

保存対象の除外となるフィールド情報を削除します。空欄ならば全てを削除、stringまたはarrayであればそれらのフィールドを削除します。