7

ユーザーが2つの電子メールアドレス(email1とemail2)を入力できる登録フォームがあります。マーケティングの要件は、それらが一意である必要があるということです (10 人のユーザーがいる場合、10*2=20 の一意の電子メール アドレスがあるというように一意です)。

システムはすでに Cakephp で構築されているので、私が知りたいのは、箱から出してすぐにこれを実行できる isUnique 機能 (1 つのフィールドで一意) に似たものがあるかどうかです。それとも、これを自分でコーディングする運命にありますか? 前もって感謝します。

編集:リチャードの例に基づいて構築された、これは私にとってはうまくいきました:

function checkUnique($data, $fields) {
    if (!is_array($fields)) {
        $fields = array($fields);
    }
    foreach($data as $key) {
        $checks = $key;
    }
    if (empty($checks)) {
      return true;  //allow null
    }
    foreach($fields as $key) {
        $tmp[$key] = $checks;
    }
    if (isset($this->data[$this->name][$this->primaryKey])) {
        $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this->primaryKey];
    }
    return $this->isUnique($tmp);
}
4

6 に答える 6

13

これに対する解決策を CakePHP Google Group に投稿しました。

http://groups.google.com/group/cake-php/browse_frm/thread/b3a1e4ae3eeb6091/e168f54bac27c163?lnk=gst&q=checkUnique#e168f54bac27c163

以下を AppModel に追加します。

        /** 
         * checks is the field value is unqiue in the table 
         * note: we are overriding the default cakephp isUnique test as the 
original appears to be broken 
         * 
         * @param string $data Unused ($this->data is used instead) 
         * @param mnixed $fields field name (or array of field names) to 
validate 
         * @return boolean true if combination of fields is unique 
         */ 
        function checkUnique($data, $fields) { 
                if (!is_array($fields)) { 
                        $fields = array($fields); 
                } 
                foreach($fields as $key) { 
                        $tmp[$key] = $this->data[$this->name][$key]; 
                } 
                if (isset($this->data[$this->name][$this->primaryKey])) { 
                        $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this- 
>primaryKey]; 

                } 
                return $this->isUnique($tmp, false); 
        } 
} 

モデルの検証で使用されます。

        var $validate = array( 
                "name"=>array( 
                        "unique"=>array( 
                                "rule"=>array("checkUnique", array("name", "institution_id")), 
                                "message"=>"A contact with that name already exists for that 
institution" 
                        ) 
                ) 
       ); 
于 2010-03-17T16:55:47.150 に答える
13

checkUniqueのラッパーとして記述できますisUnique

class AppModel extends Model {
    public function checkUnique($ignoredData, $fields, $or = true) {
        return $this->isUnique($fields, $or);
    }
}

モデルの検証で使用されます。

public $validate = array(
    'name' => array(
        'unique' => array(
            'rule' => array('checkUnique', array('name', 'institution_id'), false), 
            'message' => 'A contact with that name already exists for that 
institution'
        )
    )
);
于 2013-03-31T16:57:33.113 に答える
-1

はいといいえ。

はい、自分でコーディングする必要がありますが、CakePHP 検証コンポーネント内で行います。

検証コンポーネントには、カスタム検証ルールを許可するメカニズムがあります。基本的に、$validate 内に関数名を入れます (通常のように)。関数を定義する必要があります。この場合、それは非常に単純です (二重の isUnique 要件を強制するだけです)。

http://book.cakephp.org/2.0/en/models/data-validation.html#custom-validation-rules

于 2010-03-17T15:07:42.827 に答える
-2

私が覚えている限りbeforeSaveでは、モデルのメソッドを使用してこの種の強制を行う必要があります。オブジェクトには少なくとも 1 つの N fks が設定されている必要がありましたが、この方法でしか実現できませんでした。

編集:このスレッドを試して、問題が解決するかどうかを確認してください。

于 2010-03-17T12:21:30.853 に答える