La comunità italiana su CakePHP

You are not logged in. Please login or register.


Pages: 1

Atom RSS

Posts [ 7 ]

by_spix

Topic: validazione isUnique su due campi

Sarà magari una domanda banale ma nelle tabelle di join per impedire il verificarsi di duplicati con la stessa coppia di valori come si opera.
Non ho visto nessun esempio di validate per gestire questo. Bisogna per forza creare una funzione nel modello?

d@d0

Re: validazione isUnique su due campi

Ciao, io ho lo stesso problema da affrontare in questi giorni, e non so come venirne fuori.

A me servirebbe fare la validazione su due o piu campi in una generica tabella, i quali non formano una chiave primaria, però devono essere unici (ad esempio 'cognome'+'nome'+'data_di_nascita').

Ho trovato questo post del 2007 (http://groups.google.com/group/cake-php … ae3eeb6091):

/* DA METTERE IN app_model.php */
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);
 } 


/* DA METTERE NEL modello DA VALIDARE */
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"
              )
      )
); 

ma non funziona come dovrebbe.

Qualcuno sa come fare?

d@d0

Re: validazione isUnique su due campi

Forse ho trovato! Non so se sia corretto al 100%, però funziona! ora riesco a validare il criterio UNIQUE su 2 o piu campi.
Ho modificato il codice precedente in questo modo:

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 sembra funzionare tutto a dovere.

Spero possa servire..

arialdomartini

Re: validazione isUnique su due campi

In linea generale, è meglio affidare questo controllo all'rdbms, creando un constraint UNIQUE su quei due campi.
Sarà il db a restituire l'errore.
Il problema è già stato affrontato (e chiuso) in questo ticket

https://trac.cakephp.org/ticket/1910

d@d0

Re: validazione isUnique su due campi

Giustissimo! Anche io metto a posto prima il db con tutti i vincoli di integrità, indici unique ecc, però è piu comodo anche avere controlli da cake secondo me, cosi almeno puoi avere dei messaggi di errore piu "significativi", altrimenti avresti semplicemente un messaggio tipo "Errore salvando i dati. Prego riprovare".

Penso che by_spix intendesse questo...boh?!

arialdomartini

Re: validazione isUnique su due campi

Sì, sicuramente.

Ma io continuo a pensare che il miglior modo sia lasciare al db il controllo. Un ulteriore controllo sul Model sarebbe ridondante e, in quanto tale, potrebbe portare a comportamenti contraddittori nel caso si decida di cambiare la logica e ci si dimentichi di aggiornare il Model. Senza contare che la complessità del codice per il controllo della clausola UNIQUE è di ordine n e, probabilmente, viste le prestazioni di PHP rispetto a quelle del codice nativo di MySQL, con tabelle mediamente popolate si avrebbero rallentamenti visibili ad ogni salvataggio.

La mia idea è che il Model dovrebbe occuparsi solo della invalidazione di un campo

Del resto, per sapere dal Db quale sia stato esattamente l'errore, basta un

$db = ConnectionManager::getDataSource('default');
$db->lastError();

Dopo di che si può lanciare un invalidate().

Last edited by arialdomartini (25-11-2008 17:09:11)

d@d0

Re: validazione isUnique su due campi

Ah beh....sfondi una porta aperta!!!!! Io sono uno stimatore della potenza dei DB, cioè di lasciare a loro il compito di controllare il corretto inserimento ecc ecc.
I primi tempi che un mio collega mi ha introdotto a cake, ho avuto una grossa discussione su questo fatto: lui insisteva che cake era "bellissimo" perchè ti permetteva di evitare di fare tutti i controlli nel db...."perchè tanto ci pensava lui".....a momenti arriviamo alle mani!!! big_smile

Sono pienamente d'accordo con te!

Posts [ 7 ]

Guest posting is disabled. You must login or register to post a reply.

Pages: 1

Topic info

1 guests and 0 users are reading this topic now


Forum quick jump menu

Currently used extensions: pun_topic_online_users, pun_karma, pun_admin_hook_navigator, pun_bbcode. Copyright © 2008 PunBB

[ Generated in 0.031 seconds, 10 queries executed ]