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); }