CakePHPのisUniqueメソッドで複数フィールドでの一意性

データの保存時のバリデーションで一意性を保ちたい時に使うisUniqueメソッドで、複数フィールドにまたがって一意性をチェックしたい時のメモ。

モデルに独自メソッドを追加

function checkUnique($data, $fields) { 
	if (!is_array($fields)) { 
		$fields = array($fields); 
	} 
	foreach($fields as $key) {
		$tmp[$key] = $this->data[$this->name][$key]; 
	}
	return $this->isUnique($tmp, false); 
 }

独自メソッドでのバリデーション

var $validate = array(
	'bookmark' => array(
			'notEmpty' => array(
				'rule' => 'notEmpty',
				'message' => '必須'
			),
			'unique' => array(
				'rule'=>array('checkUnique', array('bookmark', 'user_id')), //ユニークチェックしたいフィールド
				'message' => '違う名前にしてください。'
			)
	)
);

更新時に使う際にコントローラ側で、
$this->Model->id = $id
するとそのid以外でのチェックをしてくれる。

コントローラ側の例

function edit($id) {
	if ($this->request->is('post') || $this->request->is('put')) {
		$this->Test->id = $id;
		$this->Test->save($this->request->data);
	}
	$this->data = $this->Test->findById($id);
}

参考サイト