cutmail's blog

write the code

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;

としていますが、これはデータをとってくる際に、
どこまで連携しているテーブルのデータを取るかを指定しています。

この値を変えることにより、データの取得範囲を決めることができます。

具体的には以下の図を。

http://www.cpa-lab.com/tech/public/image/spok/200802/CakePHP_recursive_attention.jpg

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されてきたデータをモデルのインスタンスにセットしないといけないらしいです。
どおりで、エラーメッセージが出ないわけだ。