Ho un validator che verifica la validità di una tripla Tipo-Conf-Size
$where = 'itemTypeId=:myTypeId AND itemConfId=:myConfId AND itemSizeId=:mySizeId';
$params = array(':myTypeId'=>$this->itemTypeId,
":myConfId"=>$this->itemConfId,
":mySizeId"=>$this->itemSizeId
);
// In base di modifica devo permettere di salvare il record se la tripla è presente in QUESTO record
if (!$this->isNewRecord) {
$where .= " AND id!=:myId";
$params [":myId"] = $this->id;
}
$item = $this->model()->find($where, $params);
Notate che ho dovuto inserire un [font="Courier New"]if (!$this->isNewRecord)[/font] ?
Praticamente in fase di creazione devo, ovviamente verificare che NON esista in tabella un’altra tripla identica.
Anche in fase di modifica devo fare la verifica, ma in questo caso mi da un falso errore, perchè il record attuale, che è in modifica, ha proprio quella tripla, quindi devo escludere l’id del record corrente da quelli che matchano.
[b]Esiste un’altra soluzione ?
[/b]
Se lascio [font="Courier New"] AND id!=$this->id [/font], in fase di salvataggio NON SO PERCHè ma il controllo passa anche se la tripla esiste.
Anche se hai risolto, mi sembra molto strano che una query semplice come quella dia problemi di… sql.
Una cosa tipo
SELECT * FROM pippo WHERE nome = 'ciao' AND id <> 2
è corretta (puoi anche usare !=) e funziona egregiamente, usare invece id <> NULL non è consentito, oddio puoi farlo ma non avrai mai un risultato perché la comparazione aritmetica con NULL da sempre NULL, mentre id IS NOT NULL è la via corretta.
Che tu usi InnoDB è cosa buona altrimenti non potresti impostare chiavi straniere
Premesso questo se il tuo ‘:myId’ che passi alla query può essere NULL allora devi prima convertire quel NULL a 0 o cambiare approccio!