Web事業部実績紹介
Web事業部実績紹介
2013.06.19

「AppModel」を有効に活用して開発の効率化する方法

tetsu

どうもtetsuです。
今回はCakePHP2系のモデル「AppModel」を有効に活用する事例を紹介します。
「AppModel」をうまく使うとコーディングする量を減らしたり、
コーディングルールを統一化させたりが可能となります。

■論理削除の共通化

データベースに保存された1レコードデータを削除すると
通常は物理削除となり、CakePHPのモデル「delete()」でも同様に処理されます。
これを論理削除として扱う場合、削除キーを用意し
その値で削除されたかどうかを判定させます。

削除を実行した際に削除キーを用いた処理コントローラーまたは
モデルに都度コーディングしていては無駄となってしまいますので、
「AppModel」で共通処理を記述するだけで実装が可能となります。

実装例は以下です。

1.「削除キー」の定義

AppModel.php

class AppModel extends Model {
	//削除キーの定義
	public $deleted_name='deleted';
}

2.論理削除処理の実装

AppModel.php

class AppModel extends Model {
	//論理削除処理
	function delete($id=null,$cascade=true){
		if($this->_isDeletedField()){
			if(empty($id)){$id=$this->id;}
			$conditions=array();
			$conditions['conditions']['AND'][$this->alias.'.'.$this->primaryKey] = $id;
			$conditions['fields']=array($this->primaryKey,$this->deleted_name);
			$conditions['recursive']=-1;
			$data = $this->find('first',$conditions);
			if(!empty($data)){
				$data[$this->alias][$this->deleted_name]=1;
				return $this->save($data);
			}else{
				return false;
			}
		}else{
			return parent::delete($id,$cascade);
		}
	}
	//「削除キー」の有無確認
	function _isDeletedField(){return isset($this->_schema[$this->deleted_name]);}
}

上記を実装するだけで、「delete()」メソッド実行時に、
「削除キー」となる「deleted」フィールドが存在する場合、
論理削除として処理し、存在しない場合は物理削除として扱います。

以上、論理削除の実装は完了です。
あとは通常通り「delete()」メソッドを利用するだけとなります。

■「exists」メソッド拡張

CakePHPの「exists」メソッドはプライマリーキーを対象に指定したIDが
存在するかどうかを判定するメソッドですが、
プライマリーキーのみしか対象が無くプラスαで指定したい場合、
例えば「削除キー」なども含めたい場合は「find」メソッドを使わなければなりません。

そこで、「exists」メソッドを拡張して「AppModel」に追加してしまえば、
プライマリーキーとプラスαの条件指定を行うことが可能になります。

実装例は以下です。

1.「exists」メソッド拡張

AppModel.php

class AppModel extends Model {
	//「exists」メソッド拡張
	public function exists($id = null,$bindConditions=array()) {
		if ($id === null) {
			$id = $this->getID();
		}
		if ($id === false) {
			return false;
		}
		$conditions = array($this->alias . '.' . $this->primaryKey => $id);
		$conditions = am($conditions,$bindConditions);
		$query = array('conditions' => $conditions, 'recursive' => -1, 'callbacks' => false);
		return ($this->find('count', $query) > 0);
	}
}

上記だけでプライマリーキーのみ、または追加したい条件を追加して
メソッドを使えるようになります。

最後に

今回は2点の方法を紹介しましたが、あくまでも一例です。
実際の案件やコーディングルールによって、異なる場合もあるので
参考程度にご利用下さい。