cakephpで重複チェック
cakephpでメールアドレスやIDなどのプライマリーキーの重複チェックを行う関数を書いてみました。
function unique($data, $name){
$this->recursive = -1;
$found = $this->find(array("{$this->name}.$name" => $data));
return !$found;
}
実際には、モデルのvalidateで
'rule' => array( 'unique', $primaryKey ),
のように呼び出します。
この関数の中で
$this->recursive = -1;
としていますが、これはデータをとってくる際に、
どこまで連携しているテーブルのデータを取るかを指定しています。
この値を変えることにより、データの取得範囲を決めることができます。
具体的には以下の図を。
recursiveの範囲
| -1 | カレントテーブルのみ |
| 0 | カレントテーブル+第1次アソシエーションテーブル(hasOne,belongsTo) |
| 1 | カレントテーブル+全ての第1次アソシエーションテーブル |
| 2 | 上記+第2次アソシエーションテーブル |
| 3以上 | 上記+第3(以上)次のアソシエーションテーブル |
cakephp1.2でvalidateを使うときに気をつけたい1つのこと
タイトルに数字を入れるのがはやっているみたいですね。
これで、アクセス伸びたりするのかな?
Model::validatesの使い方
コントローラ内でvalidates()を使う際に、
cakephp1.1と1.2で微妙に使い方が違うらしく、
結構はまったので、メモ。
1.1だと下のように書くとvalidateできますが、
<?php if ($this->Test->validates($this->data)) { echo '成功!'; } else { echo '失敗'; } ?>
1.2だと
<?php $this->Test->set($this->data); if ($this->Project->validates()) { echo '成功'; } else { echo '失敗'; } ?>
のように、postされてきたデータをモデルのインスタンスにセットしないといけないらしいです。
どおりで、エラーメッセージが出ないわけだ。
