バリデーションでメールアドレスの重複登録チェック

結論から言うと、メンバ変数+αで簡単に重複チェックできるCakePHP1.2系は偉いです。

メールアドレスの重複登録を防ごうとしたけれど、やり方がわかりませんでした。なんとなくbeforeSave()かなあと思って取り掛かりましたが、そこから先に進めず。どうやらparent::validates()がキーワードらしいのでいろいろググりました。


CakePHP – validate | Shin x blog
http://www.1×1.jp/blog/2006/08/cakephp_validate.html

CakePHP モデルの validation の拡張 | Sun Limited Mt.
http://www.syuhari.jp/blog/archives/139

参考にしたのはこの辺。validatesの返り値やエラーメッセージの入れ方をAPI for CakePHP とにらめっこしながら、頭をひねってモデルの中を書きました。

function validates($data = array())
{
if(!parent::validates($data)){return false;}
$cond = array('mail' => '= '.$this->data['Mail']['mail']);
if($this->findCount($cond) === 0){
return true;
}else{
$this->invalidate('mail', 'そのメールアドレスは登録されています');
return false;
}
}

期待通りに動くので、もちろんこれでもOKです。ただ、ん?これ普通にバリデーションで出来ね?と思ったので書き直してみました。

var $validate = array(
'mail' => array(
'duplicate' => array(
'rule' => 'checkDuplicate',
'message' => 'そのメールアドレスは登録されています',
)
),
);
function checkDuplicate($mail)
{
$cond = array('mail' => '= '.current($mail));
return ($this->findCount($cond) === 0) ? true : false;
}

うわーん。こっちなら調べる必要なかった上に一目瞭然。上は数時間、下は3分。同じ轍踏む人が減るように書き残しておきます。validates()の書き方覚えたのもいつか役に立つといいなあ。 ついでにもうちょっとだけ汎用性高いものも書き残しておきます。

function checkDuplicate($data)
{
$cond = array(key($data) => '= '.current($data));
return ($this->findCount($cond) === 0) ? true : false;
}
広告

バリデーションでメールアドレスの重複登録チェック」への5件のフィードバック

  1. 確かに!
    こんな感じでどうでしょう
    //重複チェックのバリデート
    function checkDuplicate($data)
    {
    $cond = array(key($data) => '= '.current($data));
    if(($id = $this->getID()) !== false){
    $cond[$this->name.'.id'] = '!= '.$id;
    }
    return ($this->findCount($cond) === 0) ? true : false;
    }

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中