Domanda

Ho una forma di registrazione in cui gli utenti possono compilare in due indirizzo e-mail (email1 & Email2). requisito del marketing è che hanno bisogno di essere unico (unico come se avessimo 10 utenti, allora non ci sarebbe 10 * 2 = 20 l'indirizzo e-mail univoco).

Il sistema è già costruito su CakePHP, quindi quello che mi piacerebbe sapere è, c'è qualcosa di simile alla funzione isUnique (unico in un campo) che può fare questo diritto fuori dalla scatola? O sto condannato per codificare questo me stesso? Grazie in anticipo.

EDIT: costruita sull'esempio di Richard, questo ha funzionato per me:

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);
}
È stato utile?

Soluzione

ho postato una soluzione a questo sulla CakePHP Google Gruppo:

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

Aggiungere il seguente alla 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); 
        } 
} 

e viene utilizzato nel modello validate:

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

Altri suggerimenti

checkUnique potrebbe semplicemente essere scritto come un wrapper per isUnique.

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

e viene utilizzato nel modello validate:

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

Da cakePHP 2.0 documentazione:

È possibile convalidare che un insieme di campi sono unici, fornendo più campi e impostare o $ false:

public $validate = array(
    'email' => array(
        'rule' => array('isUnique', array('email', 'username'), false),
        'message' => 'This username & email combination has already been used.'
    )
);

Assicurati di includere il campo originale nella lista dei campi quando si effettua una regola unica su più campi.

Se un campo quotata non è incluso nei dati del modello, allora è trattato come un valore nullo. Si può prendere in considerazione la marcatura i campi elencati come richiesto.

Sì e no.

Sì, si dovrà codificare da soli, ma all'interno del componente di validazione CakePHP.

Il componente di validazione ha un meccanismo per consentire le regole di convalida personalizzato. In sostanza, si mette un nome di funzione all'interno $ validate (come si farebbe normalmente). Dovete definire la funzione; in questo caso, è abbastanza semplice (basta far rispettare il vostro requisito doppia isUnique).

http: //book.cakephp .org / 2.0 / it / modelli / dati-validation.html # custom-validazione-regole

A rischio di essere picchiati sulla testa e sulle spalle per l'offerta di un non CakePHP soluzione, mi permetta di presentare le seguenti.

Crea un indice univoco nel database oltre tuttavia molte colonne necessarie.

sintassi SQL standard per questo è:

create unique index {IndexName} on {Table} ({Column}, {Column}, ...)

posiziona il "$ this-> Model-> save ()" comando all'interno di un blocco "try / catch". Nel blocco "catturare", verificare l'eccezione per il codice di errore. In MySQL, una violazione di chiave unica è il codice di errore 23000, ma si dovrebbe essere pronti per altri errori possibili pure.

È rapido e semplice e non comporta contare parentesi di matrice.

Si dovrebbe sempre posto database dei codici di accesso all'interno di un "try / catch" blocco in ogni caso. Parte della vostra gestione delle eccezioni dovrebbe includere la registrazione eventuali messaggi di errore imprevisti. Non si può pretendere di fare CakePHP tutto per voi.

Per quanto mi ricordo, è necessario questo tipo di applicazione con il metodo beforeSave nel modello. Ho avuto un requisito che un oggetto ha almeno uno di N set FKS, e ho potuto fare solo in questo modo.

Modifica: prova a questa discussione per vedere se qualcosa ci risolve il vostro problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top