どうも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点の方法を紹介しましたが、あくまでも一例です。
実際の案件やコーディングルールによって、異なる場合もあるので
参考程度にご利用下さい。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。